这个英特尔jmpq指令有什么作用?

时间:2013-11-27 19:12:27

标签: assembly gdb x86-64

如何在以下英特尔指令中计算地址0x6008600x4003b8 + 0x2004a2 = 60085a,所以我看不到计算是如何进行的。

0x4003b8 <puts@plt>: jmpq *0x2004a2(%rip) # 0x600860 <puts@got.plt>

2 个答案:

答案 0 :(得分:21)

在Intel上,JMP,CALL等与 next 指令的程序计数器有关。

您案例中的下一条说明是0x4003be0x4003be + 0x2004a2 == 0x600860

答案 1 :(得分:0)

对于具有RIP相对寻址模式的内存间接JMP,它是AT&amp; T语法。

从相对于指令指针指定的内存位置获取跳转地址: 首先计算0x4003be + 0x2004a2 == 0x600860然后获取地址以跳转到位置0x600860

其他寻址模式也是可能的,例如跳转表可能使用
jmpq *(%rdi, %rax, 8)表格基础在RDI中,索引在RAX中。

但静态数据的RIP相对寻址很常见。在这种情况下,它通过动态链接设置GOT(全局偏移表)中的条目。