我刚开始学习装配。我一直在编写简单的C编码并将其编译为汇编。以下是非常简单的。
C编码
int main(){
int a;
a = 25;
return a;
}
装配
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $25, -4(%ebp)
movl -4(%ebp), %eax
leave
ret
我不明白为什么16从%esp减去。
答案 0 :(得分:4)
在堆栈上分配16个字节。在x86架构上,堆栈从较高地址到较低地址。从堆栈指针中减去16会为您的函数分配该内存。
答案 1 :(得分:2)
它在堆栈上创建一些空间(称为函数堆栈帧)来存储局部变量,并在离开函数时立即销毁。编译器生成的数字可能会有所不同,也可能超出函数的需要。