2012-10-13 39 views
6

可能重复:
What’s the purpose of the LEA instruction?
LEA instruction?无法理解装配指令“加载有效地址”

所以我正在上课的二进制炸弹分配(它有一堆阶段你必须浏览一个程序的汇编代码并找到解密“炸弹”的密码)。

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

我看着特别的命令是跟随

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

在下一行EAX和EBX一个

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

进行比较,如果相等,程序继续,否则炸弹就会爆炸。

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

现在我无法找到的是-0x18特别指的是什么。负面信号是做什么的?它表明减法?它在ebp之前看了18个字节?

感谢您的任何帮助。

回答

14

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

考虑您的第一个指令LEA:

lea -0x18(%ebp), %ebx 

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

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

对比这与你的MOV指令:

mov -0x4(%ebx), %eax 

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

1

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

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

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

负偏移表示位置低于寄存器中的地址,正偏移表示该位置高于寄存器中的地址。这是常见的,在底部来表示具有零个地址的存储器和地址生长朝向顶部在附图中:

0xFFFFFFFC !_______! 
    .... 
+0x4(ebp) -> !_______! 
(ebp) ->  !_______! 
-0x4(ebp) -> !_______! 
    .... 
0x00000000 !_______!