麻烦理解汇编命令“加载有效地址”

时间:2012-10-13 03:20:41

标签: assembly x86

  

可能重复:
  What’s the purpose of the LEA instruction?
  LEA instruction?

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

我无法完成当前阶段,因为我不理解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个字节吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:18)

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寄存器中。

答案 1 :(得分:1)

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

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

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

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

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