我为一个项目解散了一些东西,我遇到了以下一行
jmp *0x80498c0(,%eax,4)
跳转指令到底要做什么? 这是在gdb环境中。
由于
答案 0 :(得分:8)
这是间接跳跃。
指令计算位置[0x80498c0 + eax*4]
,加载存储在那里的值并跳转到存储在该位置的地址。
这种代码在跳转表中非常常见,通常是在C switch
指令或同等指令之后。
编辑:*
特定于AT& T语法。它是 dereference 的助记符,就像在C中一样。如果大括号中的部分丢失,则需要它。jmp 0x80498c0
只会跳转到此地址,其中{{1}跳转到存储在0x80498c0中的指针的目标。
答案 1 :(得分:3)
请参阅引用内存:部分here
32位寻址可以看作如下(AT& T格式)
immed32(basepointer,indexpointer,indexscale)
这被翻译为
给出的地址值immed32 + basepointer + indexpointer * indexscale
例如,要解决一个[i],其中“a”是一个整数数组,你可以写
(%eax,%ebx,4)
这样eax寄存器保存a的基指针而ebx具有索引i。