我是汇编语言的新手,我想知道局部变量,为什么我们(或编译器)通常通过在过程的序言和过程结束时减少“ESP”寄存器来在堆栈上为它们保留一个空间我们再次分配“ESP”它的旧值。像这个代码示例:
; a procedure that create the stack frame then assign 10, 20 values for two local variables then return to caller
two_localv_proc PROC
push ebp
mov ebp,esp
sub esp,8
mov DWORD PTR [ebp-4],10
mov DWORD PTR [ebp-8],20
mov esp,ebp
pop ebp
ret
two_localv_proc ENDP
如果我们删除 (sub esp,8) 行和 (mov esp,ebp) 行,最后一个代码片段将完全正确,就像这样
two_localv_proc PROC
push ebp
mov ebp,esp
mov DWORD PTR [ebp-4],10
mov DWORD PTR [ebp-8],20
pop ebp
ret
two_localv_proc ENDP
那么为什么我们(或编译器)会这样做!,我们为什么不直接使用堆栈内存来存储我们的局部变量,只要“ESP”指针不会受到堆栈上存储值的影响,代码如下:
mov DWORD PTR [ebp-8],20