13

可能重复:
LEA 指令的目的是什么?
LEA 指令?

所以我正在研究类的二进制炸弹分配(它有很多阶段,你必须逐步完成程序的汇编代码并找到一个密码来解码“炸弹”)。

我无法完成当前阶段,因为我不懂 lea 命令。我读过它通常用于算术,但我只是不明白它是如何做到的。

我特别看的命令是

lea -0x18(%ebp), %ebx
lea -0x8(%ebp), %esi

其次是

mov -0x4 (%ebx), %eax
add -0x8(%ebx), %eax

在下一行中,比较 eax 和 ebx,如果它们相等,则程序继续,否则炸弹爆炸。

我已经对这个阶段有了足够的了解,知道它需要 6 个数字,前两个是 0 和 1。之后它会进行一些操作以确定序列的其余部分是否正确(我假设 lea 命令是什么我需要解码才能找到下一个数字)。

现在我找不到的是 -0x18 特别指的是什么。负号是做什么的?它表示减法吗?它在 ebp 之前看起来是 18 个字节吗?

感谢您在这里的任何帮助。

4

2 回答 2

27

LEA 指令使用与 MOV 指令相同的算法计算内存地址。但与 MOV 指令不同的是,LEA 指令只是将计算出的地址存储在其目标寄存器中,而不是加载该地址的内容并存储它。

考虑您的第一个 LEA 指令:

lea -0x18(%ebp), %ebx

该指令计算 -0x18 和 EBP 寄存器中的值之和。它得到一些结果 S。它将 S 存储在 EBX 寄存器中。

在加数-0x18 中,“-”为负号,“0x”表示为十六进制常数。所以加数是负数 18 16,即 -24 10。所以这条 LEA 指令只是简单地从 EBP 中的值减去 24 并将结果存储在 EBX 中。

将此与您的 MOV 指令进行对比:

mov -0x4(%ebx), %eax

该指令计算 -0x4 和 EBX 寄存器中的值之和。它得到一些结果 S。然后它在内存中的地址 S 处获取字的值,得到一些值 M。它将 M 存储在 EAX 寄存器中。

于 2012-10-13T04:01:11.983 回答
1

LEA指令将使用特定寻址模式评估的地址加载到目标寄存器中。考虑以下两种情况:

lea -0x18(%ebp), %ebx
mov -0x18(%ebp), %ebx

第一条指令将计算为相对于 ebp 当前值的偏移量 -0x18 的地址加载到 ebx 中。第二条指令将这个地址的内存内容加载到 ebx 中。

负偏移意味着位置低于寄存器中的地址,正偏移意味着位置高于寄存器中的地址。通常用底部的零地址来表示内存,并且在图中地址向顶部增长:

0xFFFFFFFC   !_______!
    ....
+0x4(ebp) -> !_______! 
(ebp) ->     !_______! 
-0x4(ebp) -> !_______! 
    ....
0x00000000   !_______!
于 2012-10-13T04:00:23.443 回答