gpt4 book ai didi

c - 堆栈上的局部变量和 EBP 之间是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:31 24 4
gpt4 key购买 nike

对于这个简单的代码:

void main(){
char buf[12];
buf[11]='\xff';
puts(buf);
}

我使用 gdb 调试此代码并获取其堆栈信息,如下所示:

0xbffff480:     0x40158ff4      0x40158ff4      0xff0494dc      0x40158ff4
0xbffff490: 0x00000000 0x40016ca0 0xbffff4f8 0x40045de3

0xbffff480是“buf”开始的地方,最后两个字是EBP和RET,但是buf和EBP之间是什么鬼?显然我没有任何其他本地变量。我还尝试过,如果我在堆栈上为 buf 分配 8 个字节,它只是从 EBP 继续,但如果我分配 9 个或更多字节,它总是介于两者之间。有人可以向我解释一下吗?多谢!我在 linux 2.6.9

主要反汇编:

0x080483c4 <main+0>:    push   %ebp
0x080483c5 <main+1>: mov %esp,%ebp
0x080483c7 <main+3>: sub $0x28,%esp
0x080483ca <main+6>: and $0xfffffff0,%esp
0x080483cd <main+9>: mov $0x0,%eax
0x080483d2 <main+14>: add $0xf,%eax
0x080483d5 <main+17>: add $0xf,%eax
0x080483d8 <main+20>: shr $0x4,%eax
0x080483db <main+23>: shl $0x4,%eax
0x080483de <main+26>: sub %eax,%esp
0x080483e0 <main+28>: movb $0xff,0xfffffff3(%ebp)
0x080483e4 <main+32>: lea 0xffffffe8(%ebp),%eax
0x080483e7 <main+35>: mov %eax,(%esp)
0x080483ea <main+38>: call 0x80482e4
0x080483ef <main+43>: leave
0x080483f0 <main+44>: ret

最佳答案

那就是 padding .你的编译器可能是 aligning EBP 在 8 字节边界上,因为对齐的内存几乎总是 easier and faster一起工作(从处理器的角度来看)。有些数据类型甚至需要正确对齐才能工作。

当您在缓冲区中仅分配 8 个字节时,您看不到任何填充,因为在这种情况下,EBP 已经正确对齐。

关于c - 堆栈上的局部变量和 EBP 之间是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4162964/

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