c - 汇编跳转指令地址计算

标签 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。我的计算有什么问题?

最佳答案

jmp    *0x804a09c(,%eax,4)

表示跳转到本次计算结果存放的地址0x804a09c(,%eax,4)*整体上不只是0x804a09c。 AT&T 语法可能会产生误导,Intel 语法在这里更清晰:

jmp    DWORD PTR [eax*4+0x804a09c]

应该是:

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

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

相关文章:

程序集 x86 NULL 终止符 (TASM)

c - VGA编程中的 "scan"是什么?

c - GCC 发现错误包括

php - C 中 PHP vsprintf() 的等价物是什么?

c - 打印从文件加载的字符串 (char*),没有转义的特殊序列(如\n)

multithreading - `xchg` 是否包含 `mfence` 假设没有非时间指令?

c - 查看堆栈中的内容

x86 - x87 相对于 SSE 的优势

linux - 为什么linux内核使用陷阱门来处理divide_error异常?

c - 为什么 C 关键字区分大小写?