rax
是获取当前指令地址的偏移量还是下一条指令的地址?从微码的角度来看,如果答案是下一条指令,则会更容易。
rax
是获取当前指令地址的偏移量还是下一条指令的地址?从微码的角度来看,如果答案是下一条指令,则会更容易。
在64位模式下实现了一种新的寻址形式,即RIP相对(相对指令指针)寻址。通过将64位RIP和下一条指令的位移相加来形成有效地址。
symbol_name(%rip)
计算从此处到达 symbol_name
所需的偏移量,而不是将绝对地址添加到 RIP 作为偏移量。mov 4(%rip), %rax
),它将加载从此指令结束后的第4个字节开始的8个字节。RIP+rel8
编码,只有rel32,因此将数据保留在代码旁边没有任何好处。(除了可能从代码获取带来统一缓存级别的L2缓存命中。) - Peter Cordes
jmp
指令的立即数是相对于下一条指令的位移量。 - Jonathon Reinhart[disp32]
。x86-64将非SIB版本重新用作[rip + rel32]
,同时保留了没有基址或索引的ModRM+SIB编码作为[disp32]
。主要是因为disp32绝对地址仅适用于索引静态数组:在x86-64 Linux中不再允许32位绝对地址?。但是32位绝对地址在某些情况下可能会用到,例如当RIP相对寻址模式无法微融合时,如cmpl $1, foo
。 - Peter Cordes