装配跳转指令地址计算

时间:2013-10-23 01:50:16

标签: c assembly x86 gdb

我在gdb中看到以下说明

jmp    *0x804a09c(,%eax,4)

在执行之前,我输入以下命令:

(gdb)p/x *0x804a09c
$40 = 0x8048e0e

(gdb) p $eax
$41 = 6

所以,当我尝试计算地址时,我会跳到,我得到:

(gdb) p/x *0x804a09c + 4*$eax
0x8048e26

然而,跳转实际上转到地址0x8048ead。我的计算有什么问题?

1 个答案:

答案 0 :(得分:5)

jmp    *0x804a09c(,%eax,4)

表示跳转到存储在此计算结果中的地址0x804a09c(,%eax,4)*整体上不是0x804a09c。 AT& T语法可能会产生误导,英特尔语法在这里更加明确:

jmp    DWORD PTR [eax*4+0x804a09c]

所以它应该是:

(gdb) p/x *(0x804a09c + 4 * $eax)