gpt4 book ai didi

assembly - 为什么在此函数代码的序言中从堆栈指针中减去 0x20?

转载 作者:行者123 更新时间:2023-12-01 12:49:41 25 4
gpt4 key购买 nike

void main(){
int c;
c = function(1, 2);
}

int function(int a, int b){
char buf[10];
a = a+b;
return a;
}

汇编代码:
          main:
08048394: push %ebp
08048395: mov %esp,%ebp
08048397: and $0xfffffff0,%esp
**0804839a: sub $0x20,%esp <-----------------------???????**
0804839d: movl $0x2,0x4(%esp)
080483a5: movl $0x1,(%esp)
080483ac: call 0x80483b7 <function>
080483b1: mov %eax,0x1c(%esp)
080483b5: leave
080483b6: ret
function:
080483b7: push %ebp
080483b8: mov %esp,%ebp
080483ba: sub $0x10,%esp
080483bd: mov 0xc(%ebp),%eax
080483c0: add %eax,0x8(%ebp)
080483c3: mov 0x8(%ebp),%eax
080483c6: leave
080483c7: ret

我知道按 16 字节对齐,
但是,在 main() 中, int c(=4 byte) + 1(4byte) + 2(4byte) in function(1 ,2)调用语句。

所以总和是 12 字节。但通过内存对齐,我预计 16 字节。
(sub 0x10, %esp)

为什么要分 0x20, %esp ?

最佳答案

考虑这个函数:

void main(){
int c, d, e, f;
c = function(1, 2, 3, 4);
d =1;
e = 2;
f = 3;
}

这仍然会分配 0x20 空间。

但是,如果再添​​加 1 个局部变量或函数参数,它将立即分配 0x30 空间。

现在考虑当 main 函数中什么都没有,而只有一个语句时:
int c = 1;

那么在这种情况下,它将分配 0x10 空间。

你看到这里的模式了吗?系统首先为局部变量分配空间。然后它将为函数参数分配空间。分配的空间与 0x10 对齐。

这就是您看到 0x20 的原因。 0x10 是局部变量,另一个 0x10 是函数参数。

关于assembly - 为什么在此函数代码的序言中从堆栈指针中减去 0x20?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13430540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com