【问题标题】:Assembly Instruction interpretation组装说明解释
【发布时间】:2012-10-08 19:05:49
【问题描述】:

我看到了这条指令:

*0x804a1a0(,%eax,4)

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

【问题讨论】:

  • 也许 *(0x804a1a0+eax*4) ?在我看来,这就像一个开关跳台。

标签: c assembly gdb


【解决方案1】:

简短的回答:

你说:

我得到了 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 处执行,而是读取存储在该位置的地址,然后跳转到该位置(因此它是一个间接跳转)。

Side rant:我真的很讨厌 AT&T 语法。如果您不熟悉汇编,您可能更喜欢 Intel 语法。我认为它更具可读性。您的 Intel 语法代码可能是:

jmp dword ptr [0x804a1a0 + eax*4]

假设指令是跳转。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多