大会指导解释

时间:2012-10-08 19:05:50

标签: c assembly gdb

我看到了这条指令:

*0x804a1a0(,%eax,4)

我得到了0x804a1a0的值并添加了$ eax * 4的值,但这不是代码跳转到的地方。我使用值0x804a1a0本身加上$ eax * 4做了同样的事情,它指向其他地方。我如何解释上述说明?

1 个答案:

答案 0 :(得分:4)

短的anwser:

你说:

  

我得到了0x804a1a0的值并添加了$ eax * 4

的值

这是错误的。

  

我使用值0x804a1a0本身加上$ eax * 4

做了同样的事情

这也是错误的。

您想要的是首先计算0x804a1a0 + eax*4,然后查看该内存位置的值。

答案很长:

您提供的代码不是完整指令,而是 AT& T 语法中移动/跳转/调用指令的操作数。更具体地说,它被称为有效地址。基本上这是间接寻址的一种形式,这意味着将使用操作数给定位置的内存。

有效地址的 AT& T 语法为:

DISP(BASE,INDEX,SCALE)

应解释为:

BASE + INDEX*SCALE + DISP

在你的情况下,

0x804a1a0(,%eax,4)

真的是:

%eax*4 + 0x804a1a0

现在针对*,根据http://wiki.osdev.org/Opcode_syntax

  

相对寻址:默认情况下用于所有跳转和调用指令。

     

要使用绝对寻址,操作数必须以星号(*)为前缀。

此外,来自http://en.wikipedia.org/wiki/Addressing_mode

  

绝对指令地址的有效地址是地址参数本身,无需修改。

因此,最终地址实际上是eax*4 + 0x804a1a0指向的位置。

如果我不得不猜测,我会说它可能是偏移0x804a1a0处的跳转/切换表。换句话说,代码不会在偏移eax*4 + 0x804a1a0处执行,而是会读取存储在该位置的地址,然后跳转到该位置(因此它是间接跳转)。

旁边咆哮:我真的讨厌 AT& T 语法。如果您不熟悉汇编,则可能更喜欢Intel语法。我认为它更具可读性。您的英特尔语法代码可能是:

jmp dword ptr [0x804a1a0 + eax*4]

假设指令是跳跃。