汇编jmp内存表达式

时间:2012-04-18 02:08:46

标签: assembly gdb disassembly

我为一个项目解散了一些东西,我遇到了以下一行

jmp *0x80498c0(,%eax,4)

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

由于

2 个答案:

答案 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。