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

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):偏移量直接写为立即数4
  • jmpq 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:54:02