Для этого простого кода:
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? Очевидно, у меня нет никаких других локальных перемен. И я также попытался выделить 8 байтов для buf в стеке, он просто продолжится с 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