You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NASM汇编编程时为何出现内存访问错误?

问题解答

为什么会出现段错误?

你的代码里的ret指令是问题根源。_start是ELF程序的入口点,操作系统加载程序后会直接跳转到这个标签执行,没有任何函数调用过程——也就是说,栈顶并没有一个合法的返回地址。而ret指令的作用是从栈中弹出一个地址并跳转到该地址执行,此时栈里的内容是随机的垃圾数据,自然会触发内存访问错误(段错误)。

你提到的两类没问题的程序:

  • 用学校封装函数的程序:这类封装通常会借助libc的启动代码(比如crt0),它会把_start包装成一个被调用的函数,提前在栈上准备好合法的返回地址,所以用ret不会出错。
  • 用syscall的程序:rax=60对应的是Linux的exit系统调用,执行syscall会直接让操作系统终止进程,不需要依赖栈上的返回地址,所以能正常退出。

如何修改代码?

最直接且正确的做法是用syscall代替ret,完成进程退出:

global _start
 
section .text
 
_start: 
        mov rax, 60    ; Linux exit系统调用号
        mov rdi, 0     ; 退出状态码0(表示正常退出)
        syscall        ; 触发系统调用

如果你非要用ret(不推荐,因为不符合程序入口的规范),需要手动在栈上压入一个合法的返回地址,但这完全没必要,因为操作系统并没有为_start设置返回目标。

内容的提问来源于stack exchange,提问作者TetsuWasabi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 03:30:46