我在gdb中看到以下指令

jmp    *0x804a09c(,%eax,4)

在执行之前,我键入以下命令:
(gdb)p/x *0x804a09c
$40 = 0x8048e0e

(gdb) p $eax
$41 = 6

所以当我试图计算我要跳到的地址时,我得到:
(gdb) p/x *0x804a09c + 4*$eax
0x8048e26

然而,跳转实际上转到地址0x8048ead。我的计算怎么了?

最佳答案

jmp    *0x804a09c(,%eax,4)

意思是跳转到存储在计算结果中的地址,总的来说0x804a09c(,%eax,4)不只是*。AT&T的语法可能会产生误导,英特尔的语法在这里更为清晰:
jmp    DWORD PTR [eax*4+0x804a09c]

所以应该是:
(gdb) p/x *(0x804a09c + 4 * $eax)

关于c - 汇编跳转指令地址计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19531387/

10-15 00:24