下面的代码是由 gcc 从一个简单的 scanf 程序生成的。我的问题是
- 为什么这3个变量地址在分配时不连续?
- 如果不是,我什么时候可以通过观察子句来推测从堆栈生成的变量的数量,例如
add esp, N
它经常出现在例程的末尾?它与调用约定有关吗? - 在这个例子中,为什么编译器没有
add esp, 20h
用它生成?
C代码
#include <stdio.h>
int main() {
int x;
printf ("Enter X:\n");
scanf ("%d", &x);
printf ("You entered %d...\n", x);
return 0;
};
汇编
main proc near
var_20 = dword ptr -20h
var_1C = dword ptr -1Ch
var_4 = dword ptr -4
push ebp
mov ebp, esp
and esp, 0FFFFFFF0h
sub esp, 20h
mov [esp+20h+var_20], offset aEnterX ; "Enter X:"
call _puts
mov eax, offset aD ; "%d"
lea edx, [esp+20h+var_4]
mov [esp+20h+var_1C], edx
mov [esp+20h+var_20], eax
call ___isoc99_scanf
mov edx, [esp+20h+var_4]
mov eax, off set aYouEnteredD___ ; "You entered %d...\n"
mov [esp+20h+var_1C], edx
mov [esp+20h+var_20], eax
call _printf
mov eax, 0
leave
retn
main endp