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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:52:31