AT&T语法x86-64汇编中jmpq label(%rip)相对跳转规则是怎样的?
x86-64 AT&T汇编RIP相对寻址跳转问题解答
两种写法的跳转结果完全一致,都会跳转到当前RIP值加4的地址,和movq指令的寻址逻辑也不存在冲突,具体说明如下:
1. RIP相对寻址的通用规则
x86-64架构下AT&T语法的RIP相对寻址格式为偏移量(%rip),不管偏移量是直接写的十六进制立即数,还是被定义为常量的符号label,计算有效地址的逻辑都是统一的:
有效地址 = 执行当前指令时的RIP值 + 偏移量
注:这里的RIP值存储的是当前指令的下一条指令的起始地址,属于x86架构的固有设计。
2. 两条跳转指令的等价性说明
你给出的两条指令:
jmpq 0x4(%rip):偏移量直接写为立即数4jmpq label(%rip):当label通过.equ label, 4这类伪指令被定义为常量4时,汇编器会在汇编阶段直接将label替换为它的常量值4
两条指令汇编后生成的机器码完全相同,跳转目标自然一致,都是RIP + 4对应的地址。
3. 和movq指令的逻辑对比
你混淆的「仅取label的值作为操作数」的场景,仅出现在立即数寻址的写法中:
- 如果你写
movq $label, %rax:这里用了立即数前缀$,所以会直接把label的常量值4存入rax,和RIP无关 - 如果你写
movq label(%rip), %rax:用的是RIP相对寻址,逻辑和jmp指令完全一致,会先计算RIP + 4得到内存地址,再把这个地址里存储的8字节数据读取到rax中
也就是说,寻址逻辑只和你写的寻址格式有关,和指令是jmp还是movq无关:只要是偏移量(%rip)的格式,就会走RIP相对地址计算逻辑,不会直接把偏移量当操作数。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

