装配跳转指令地址计算

use*_*165 0 c x86 assembly gdb

我在gdb中看到以下指令

jmp    *0x804a09c(,%eax,4)
Run Code Online (Sandbox Code Playgroud)

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

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

(gdb) p $eax
$41 = 6
Run Code Online (Sandbox Code Playgroud)

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

(gdb) p/x *0x804a09c + 4*$eax
0x8048e26
Run Code Online (Sandbox Code Playgroud)

但是,跳转实际上转到地址0x8048ead.我的计算有什么问题?

小智 5

jmp    *0x804a09c(,%eax,4)
Run Code Online (Sandbox Code Playgroud)

意味着要跳转到存储在该计算结果的地址0x804a09c(,%eax,4),在*整体上不是只对0x804a09c.AT&T语法可能会产生误导,英特尔语法在这里更清晰:

jmp    DWORD PTR [eax*4+0x804a09c]
Run Code Online (Sandbox Code Playgroud)

所以它应该是:

(gdb) p/x *(0x804a09c + 4 * $eax)
Run Code Online (Sandbox Code Playgroud)