'A'
и 31337
являются литералами.У них нет причин помещаться в стек.
Было бы более интересно, если бы вы распечатали разборку этого блока кода, чтобы точно узнать, что генерирует компилятор.Затем вы можете перепроверить, что содержится в вашем стеке во время выполнения.
Учитывая, что ваша функция не имеет побочных эффектов, она может быть оптимизирована до неактивности.
Вот что я получаюс вашим кодом в среде, с которой я более знаком:
Breakpoint 1, test_function (a=1, b=2, c=3, d=4) at t.c:4
4 flag = 31337;
(gdb) disass test_function
Dump of assembler code for function test_function:
0x080483a4 <+0>: push %ebp
0x080483a5 <+1>: mov %esp,%ebp
0x080483a7 <+3>: sub $0x10,%esp
=> 0x080483aa <+6>: movl $0x7a69,-0x4(%ebp)
0x080483b1 <+13>: movb $0x41,-0xe(%ebp)
0x080483b5 <+17>: leave
0x080483b6 <+18>: ret
End of assembler dump.
(gdb) display $ebp
2: $ebp = (void *) 0xffffcd70
(gdb) display $esp
3: $esp = (void *) 0xffffcd60
(gdb) x/16xw $esp
0xffffcd60: 0xf7e7dcdd 0xf7fa7324 0xf7fa6ff4 0x00000000
0xffffcd70: 0xffffcd88 0x080483e1 0x00000001 0x00000002
0xffffcd80: 0x00000003 0x00000004 0xffffcdf8 0xf7e66cc6
0xffffcd90: 0x00000001 0xffffce24 0xffffce2c 0x00000001
Разница в вашем случае, за исключением синтаксиса ASM, заключается в том, что мой компилятор зарезервировал меньше стека, но это все.
Итак, как и в вашем случае, литералы попадают в поток инструкций , а не в стек.Адрес стека и содержимое (интерпретируемое как 32-битные целые, осторожно с порядком байтов) локальных:
(gdb) x/1xw $ebp-4
0xffffcd6c: 0x00000000
(gdb) x/1xw $ebp-0xe
0xffffcd62: 0x7324f7e7
Теперь давайте присвоим flag
:
(gdb) n
5 buffer[0] = 'A';
(gdb) x/8xw $esp
0xffffcd60: 0xf7e7dcdd 0xf7fa7324 0xf7fa6ff4 0x00007a69
0xffffcd70: 0xffffcd88 0x080483e1 0x00000001 0x00000002
(gdb) x/1xw $ebp-4
0xffffcd6c: 0x00007a69
(gdb) x/1xw $ebp-0xe
0xffffcd62: 0x7324f7e7
Все хорошо, верноСлот стека был обновлен ($ebp-4
последний 32-битный слот в строке 1 x / 8xw).
И позволяет установить первый элемент buffer
:
(gdb) n
6 }
(gdb) x/4x $ebp-0xe
0xffffcd62: 0x41 0xf7 0x24 0x73
(gdb) x/8xw $esp
0xffffcd60: 0xf741dcdd 0xf7fa7324 0xf7fa6ff4 0x00007a69
0xffffcd70: 0xffffcd88 0x080483e1 0x00000001 0x00000002
(gdb) x/1xw $ebp-4
0xffffcd6c: 0x00007a69
(gdb) x/1xw $ebp-0xe
0xffffcd62: 0x7324f741
Все хорошо снова,Порядковый порядок делает вещи немного странными, если их рассматривать как 32-битные целые, но выглядит хорошо, если смотреть на них побайтно.