MASM中LEA的特色是什么?

时间:2014-05-15 14:09:17

标签: assembly x86 masm

已经看过一段像

这样的代码
void makeArray()
{
    char myString[30];
    for(int i = 0; i < 30; i++)
        myString[i] = '*';
}

将其变为MASM,

makeArray PROC
    push ebp
    mov  ebp, esp
    sub  esp, 32
    lea  esi, [ebp-30]
    mov  ecx, 30
L1: mov  BYTE PTR [esi], '*'
    inc  esi
    loop L1
    add  esp, 32
    pop  ebp
    ret
makeArray ENDP

问题:
我可以写mov esi, ebp-30而不是lea esi, [ebp-30]吗? 我可以写mov esp, ebp代替add esp, 32吗?

2 个答案:

答案 0 :(得分:4)

LEA是一个单独的操作,可以组合添加最多三个操作数 - 一个常量,一个寄存器和另一个寄存器,可选地乘以两个小的幂。

编辑:LEA有两个参数 - 寄存器和有效地址。有效地址可以采用以下形式:

[Base + ROffset + RIndex*Scale]

其中Base是常量,ROffset是寄存器,RIndex是另一个寄存器(或允许的相同的寄存器),Scale可以是1(即省略),2,4或8.任何加数都可以省略这个表达。例如:[100+eax]。或[ecx+esi*2]。或[20+eax+eax*8]。加数的顺序无关紧要;它可能有助于代码的可读性。

LEA计算地址并将其放入目标寄存器。地址本身,而不是该地址中的内容 - 它不是内存访问命令。但这是在一个命令中做简单算术的好方法。例如,如果RBase和ROffset相同,则可以便宜地乘以3,5或9。

  

我能写一下mov esi,ebp-30而不是lea esi,[ebp-30]吗?

不,mov不支持右侧的表达式(编译时除了表达式,例如10 + 20)。但你可以写

mov esi, ebp
sub esi, 30
  

我可以写mov esp,ebp而不是添加esp,32?

在这个特定的例子中 - 是的,你可以。

答案 1 :(得分:-1)

你的第一个陈述是错误的。缺少括号,那么它是正确的,第二个假设是正确的。