汇编寻址模式疑惑:操作外部.equ常量为何需加$前缀?
$有的不加? 核心要先搞懂$的作用:在x86-64汇编里,$标记的是立即数——直接使用数值本身;不带$的话,汇编器会把这个标识符当成内存地址,去对应地址里读取数据。下面逐个分析你遇到的场景:
movq HEIGHT_OFFSET(%rbx), %rax
这是基址+偏移量的寻址模式,HEIGHT_OFFSET是.equ定义的偏移常量(比如8)。这种寻址模式里的偏移值,汇编器会直接把常量数值计算到最终内存地址(也就是rbx + HEIGHT_OFFSET)里,不需要加$——这里的HEIGHT_OFFSET不是要读取的内存地址,只是地址计算的一部分。movq numpeople, %rcxnumpeople应该是你在数据段用.quad之类指令定义的内存变量(比如.quad 5表示存储了数值5的8字节变量)。不加$时,是把numpeople这个地址里存储的数值(比如5)加载到rcx,这正是程序需要的“总人数”。要是加了$,反而会把numpeople变量的内存地址(比如0x402000)放到rcx,完全不符合逻辑。addq $PERSON_RECORD_SIZE, %rbxPERSON_RECORD_SIZE是.equ定义的常量(比如32),你需要把这个数值直接加到rbx里,让rbx指向下一条人员记录。这时候必须加$表示这是立即数。如果不加$,汇编器会把PERSON_RECORD_SIZE当成一个内存地址,试图去这个地址读数据——但.equ只是编译期的常量,并没有在内存里分配存储空间,访问这个不存在的地址自然会触发段错误。
内容的提问来源于stack exchange,提问作者piiotr

