Регистры rsp и rbp после входа в фунцию

Есть программа на Си:

#include <stdio.h>
void f(int a, int b, int c, int d)
{
    char buffer[10];
    int value;
    value = 31337;
    buffer[0] = 'A';
}
int main()
{
    f(10,4,1,5);
}

Я ее дизассемблирую на Kali linux x88-64 при помощи gcc(gdb) без оптимизации. Ставлю точку остановки перед входом в функцию и после. Ожидаю, что регистры rbp и rsp будут хранить один адрес, а после захода в функцию - разные, но этого не происходит. Читал, что компилятор может оптимизировать rbp и не использовать как регистр стекового фрейма, но вроде у меня он его так использует.

Reading symbols from file.out...
(gdb) list 1
1       #include <stdio.h>
2       void f(int a, int b, int c, int d)
3       {
4               char buffer[10];
5               int value;
6               value = 31337;
7               buffer[0] = 'A';
8       }
9       int main()
10      {
(gdb) 
11              f(10,4,1,5);
12      }
(gdb) break 11
Breakpoint 1 at 0x114b: file file.c, line 11.
(gdb) break f
Breakpoint 2 at 0x1139: file file.c, line 6.
(gdb) run
Starting program: /home/domori/Рабочий стол/file.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at file.c:11
11              f(10,4,1,5);
(gdb) i r rsp rbp
rsp            0x7fffffffdce0      0x7fffffffdce0
rbp            0x7fffffffdce0      0x7fffffffdce0
(gdb) c
Continuing.

Breakpoint 2, f (a=10, b=4, c=1, d=5) at file.c:6
6               value = 31337;
(gdb) i r rsp rbp
rsp            0x7fffffffdcd0      0x7fffffffdcd0
rbp            0x7fffffffdcd0      0x7fffffffdcd0
(gdb) 

Не могу понять, в чем проблема.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Компилирую gcc -g -S file.c. Код функции f из file.s с моими комментариями:

f:
.LFB0:
    .file 1 "file.c"
    .loc 1 6 1
    .cfi_startproc
    pushq   %rbp                  ; сохранение регистра rbp в стеке
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp            ; копирование rsp в rbp
    .cfi_def_cfa_register 6
    movl    %edi, -20(%rbp)
    movl    %esi, -24(%rbp)
    movl    %edx, -28(%rbp)
    movl    %ecx, -32(%rbp)
    .loc 1 9 11
    movl    $31336, -4(%rbp)      ; точка останова
    .loc 1 10 16
    movb    $65, -14(%rbp)
    .loc 1 11 1
    nop
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc

Ничего удивительного что в регистрах одинаковые значения.

→ Ссылка