x64 AT&T汇编中label与constant的区别及mov指令$符号疑问
AT&T汇编中$符号的作用与你的exit系统调用问题
错误代码触发段错误的原因
你最初写的代码:
.data .equ EXIT, 60 .equ STATUS, 0 .text movq EXIT, %rax movq STATUS, %rdi syscall
在AT&T汇编语法里,不带$的符号会被当作内存地址解析。这里EXIT被定义为60,所以movq EXIT, %rax实际是尝试从内存地址0x3C(60的十六进制)读取8字节数据到%rax。而这个地址通常属于未被操作系统映射的内存区域,直接访问就会触发段错误。
加$后代码正常的原因
添加$符号的代码:
.text movq $EXIT, %rax movq $STATUS, %rdi syscall
这里的$是AT&T汇编用来标记立即数的符号,$EXIT就是直接把60这个数值加载到%rax中,$STATUS则是把0加载到%rdi中——这完全符合x86-64 Linux系统调用的要求:%rax存储系统调用号(exit对应的调用号是60),%rdi存储退出状态码。
你的误解来源
你大概率是和NASM等其他汇编语法搞混了:NASM里用[]表示内存引用,直接写符号就是取立即数;但AT&T语法逻辑相反,$标记立即数,无$标记则代表内存地址引用。
内容的提问来源于stack exchange,提问作者Benjamin Floyd
相关产品推荐
相关产品推荐

