LEA指令返回间接操作数的偏移地址。由于间接操作数可能使用一个或多个寄存器,因此其偏移值是在运行时计算的。
void makeArray( ){
char myString[
30];
for(
int i =
0;i <
30;i++)
myString[i] =
'#';
}
虽然数组有30字节,但按4字节对其,ESP减去了32。
makeArray PROC
push ebp
mov ebp,esp
sub wsp,
32
lea esi,[ebp-
32]
mov ecx,
30
L1: mov BYTE PTR [esi],
'#'
inc esi
loop L1
add esp,
32
pop ebp
ret
makeArray ENDP
使用OFFSET操作符获取堆栈参数的地址是不可能的,因为OFFSET只能获取在编译时就已经知道的地址。
lea esi,
FFSET [ebp-32] ;错误