6

我正在为一个项目拆卸一些东西,我遇到了以下行

jmp *0x80498c0(,%eax,4)

那条跳转指令到底想做什么?这是在 gdb 环境中。

谢谢

4

2 回答 2

10

这是间接跳转。

该指令计算 location [0x80498c0 + eax*4],加载存储在那里的值并跳转到存储在该位置的地址。

这种代码在跳转表中很常见,通常在 Cswitch指令或等效指令之后。

编辑:*特定于 AT&T 语法。它是取消引用的助记符,就像在 C 中一样。如果大括号中的部分丢失,则需要它 -jmp 0x80498c0只需跳转到该地址,该地址jmp *0x80498c0跳转到存储在 0x80498c0 中的指针的目标。

于 2012-04-18T08:44:47.463 回答
3

参见Referencing memory: section here
32位寻址可以看如下(AT&T格式)

immed32(基指针、索引指针、索引刻度)

这被翻译为由给出的地址处的值

immed32 + basepointer + indexpointer * indexscale

例如,要解决“a”是整数数组的 a[i],您可以编写

(%eax, %ebx, 4)

这样 eax 寄存器保存 a 的基指针,而 ebx 具有索引 i。

于 2012-04-18T02:16:18.327 回答