我正在为一个项目拆卸一些东西,我遇到了以下行
jmp *0x80498c0(,%eax,4)
那条跳转指令到底想做什么?这是在 gdb 环境中。
谢谢
我正在为一个项目拆卸一些东西,我遇到了以下行
jmp *0x80498c0(,%eax,4)
那条跳转指令到底想做什么?这是在 gdb 环境中。
谢谢
这是间接跳转。
该指令计算 location [0x80498c0 + eax*4]
,加载存储在那里的值并跳转到存储在该位置的地址。
这种代码在跳转表中很常见,通常在 Cswitch
指令或等效指令之后。
编辑:*
特定于 AT&T 语法。它是取消引用的助记符,就像在 C 中一样。如果大括号中的部分丢失,则需要它 -jmp 0x80498c0
只需跳转到该地址,该地址jmp *0x80498c0
跳转到存储在 0x80498c0 中的指针的目标。
参见Referencing memory: section here
32位寻址可以看如下(AT&T格式)
immed32(基指针、索引指针、索引刻度)
这被翻译为由给出的地址处的值
immed32 + basepointer + indexpointer * indexscale
例如,要解决“a”是整数数组的 a[i],您可以编写
(%eax, %ebx, 4)
这样 eax 寄存器保存 a 的基指针,而 ebx 具有索引 i。