已经看过一段像
这样的代码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
吗?
答案 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)
你的第一个陈述是错误的。缺少括号,那么它是正确的,第二个假设是正确的。