【问题标题】:trouble understanding assembly command "load effective address" [duplicate]无法理解汇编命令“加载有效地址”[重复]
【发布时间】:2012-10-03 21:25:57
【问题描述】:

可能重复:
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 个字节?

感谢您在此提供的任何帮助。

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

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

    考虑您的第一个 LEA 指令:

    lea -0x18(%ebp), %ebx
    

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

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

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

    mov -0x4(%ebx), %eax
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-01
        • 2014-02-27
        • 1970-01-01
        • 2013-02-25
        • 1970-01-01
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        相关资源
        最近更新 更多