【问题标题】:x86 Intel Assembler LEAx86 英特尔汇编器 LEA
【发布时间】:2015-10-04 07:43:04
【问题描述】:

查看以下代码:
(ebp-0x8 -> int)
(ebp-0x4 -> int*)

=> 0x80483f3 <main+6>:  mov    DWORD PTR [ebp-0x8],0x0
   0x80483fa <main+13>: mov    DWORD PTR [ebp-0x4],0x0
   0x8048401 <main+20>: mov    DWORD PTR [ebp-0x8],0xa

   0x8048408 <main+27>: lea    eax,[ebp-0x8]
   0x804840b <main+30>: mov    DWORD PTR [ebp-0x4],eax

   0x804840e <main+33>: mov    eax,0x0
   0x8048413 <main+38>: leave  
   0x8048414 <main+39>: ret  

真的需要 LEA 命令吗? 我知道下面的表达式是错误的,无效的,不管左边的错误地址,但是没有类似的方法可以使它变成这样吗?

=> 0x80483f3 <main+6>:  mov    DWORD PTR [ebp-0x8],0x0
   0x80483fa <main+13>: mov    DWORD PTR [ebp-0x4],0x0
   0x8048401 <main+20>: mov    DWORD PTR [ebp-0x8],0xa

   0x804840b <main+30>: mov    DWORD PTR [ebp-0x4],ebp-0x8

   0x804840e <main+33>: mov    eax,0x0
   0x8048413 <main+38>: leave  
   0x8048414 <main+39>: ret

我认为这是不可能的,但我想确定一下。

最后一个问题,表达式ebp-0x8 理论上会返回ebp 寄存器的内容减去0x8。 因此表达式[ebp-0x8] 将返回地址ebp 寄存器的内容减去0x8 处的内存内容。 现在我想知道如果 LEA 命令只获取内存中某些字节的内容,它如何获取内存地址。

抱歉,如果有一些愚蠢的问题,但 [ ] 有时可能会非常令人困惑。

【问题讨论】:

  • 为什么这被标记为 [C]?这个问题不是关于C的。我为你删除了标签。
  • 哦,不好意思,因为代码是GCC从C源代码生成的,本来我也想加的。

标签: assembly x86 intel addressing


【解决方案1】:

为了使您的第二个代码 sn-p 工作,您需要将减法作为单独的指令进行。换句话说,而不是

DWORD PTR [ebp-0x4],ebp-0x8

你需要

mov eax,ebp
sub eax,0x8
mov DWORD PTR [ebp-0x4],ax

使用lea 的优点是它结合了算术运算和mov 指令。所以不是两条指令

mov eax,ebp
sub eax,0x8

你可以使用单条指令

lea eax,[ebp-0x8]

lea 指令的意思是“加载有效地址”。第二个操作数指定地址,计算该地址所需的任何计算都由处理器中的地址生成逻辑完成。

另一方面,sub 指令使用处理器的通用算术逻辑单元 (ALU)。

总之,lea 指令通过使用处理器的地址生成逻辑将两条指令合二为一,以执行原本需要在 ALU 中完成的数学计算。

【讨论】:

    【解决方案2】:

    不,这是无效的表达式,你不能用 mov 源操作数中的内存地址做数学表达式,除非你指定 [] 括号,这是其他意思是从内存地址中取消引用值(这与取消引用 C 指针以获取其值完全一样)

    使用地址进行数学表达式的方法是使用 LEA 指令,在您的示例中是:

    lea    eax,[ebp-0x8]
    mov    DWORD PTR [ebp-0x4],eax
    

    请注意,lea 的工作方式与 mov 指令非常不同。

    这是英特尔手册中对 lea 指令的第一个定义:

    计算第二个操作数的有效地址(源 操作数)并将其存储在第一个操作数(目标操作数)中。

    mov 已知是数据传输指令,而 lea 主要用于使用数学运算计算地址

    这是 movlea

    之间不同的几个示例
    mov eax, [ebp-0x8]   ; compute new address ebp-0x8 and get its value from new address
    mov eax, ebp-0x8     ; this is invalid
    lea eax, [ebp-0x8]   ; compute new address ebp-0x8 and give it to eax
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 2015-09-29
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2016-07-13
      相关资源
      最近更新 更多