значение базового указателя после отпуска - PullRequest
0 голосов
/ 27 октября 2019

Я проверил значения регистра следующего простого исполняемого файла (ELF, X86-64). Можете ли вы объяснить, почему «rbp» равен «0x7ffd222f1e80» после «уйти»?

Я знаю, что «уйти» означает следующие две инструкции.

mov    %rbp,%rsp
pop    %rbp

Так что я ожидал этого значения.

mov $1, %eax
rax            0x1  1
rbp            0x7ffd222f1e70   0x7ffd222f1e70
rsp            0x7ffd222f1e70   0x7ffd222f1e70

leave
rax            0x1  1
rbp            0x7ffd222f1e70   0x7ffd222f1e70
rsp            0x7ffd222f1e78   0x7ffd222f1e78

// main.c

#include <stdio.h>

int f();

int main() {
  return f();
}

// func.s

.data
    .text
    .global f
f:
    push %rbp
    mov %rsp, %rbp
    mov $1, %eax
    leave
    ret

// компилировать и отлаживать

# gcc -g main.c func.s -o main
# gdb ./main
# b main
# b f
# r
# s
# i all

// регистрация

main
rax            0x55dced86d5fa   94407366202874
rbp            0x7ffd222f1e80   0x7ffd222f1e80
rsp            0x7ffd222f1e80   0x7ffd222f1e80

f
rax            0x0  0
rbp            0x7ffd222f1e80   0x7ffd222f1e80
rsp            0x7ffd222f1e78   0x7ffd222f1e78

push %rbp
rax            0x0  0
rbp            0x7ffd222f1e80   0x7ffd222f1e80
rsp            0x7ffd222f1e70   0x7ffd222f1e70

mov %rsp, %rbp
rax            0x0  0
rbp            0x7ffd222f1e70   0x7ffd222f1e70
rsp            0x7ffd222f1e70   0x7ffd222f1e70

mov $1, %eax
rax            0x1  1
rbp            0x7ffd222f1e70   0x7ffd222f1e70
rsp            0x7ffd222f1e70   0x7ffd222f1e70

leave
rax            0x1  1
rbp            0x7ffd222f1e80   0x7ffd222f1e80 (???)
rsp            0x7ffd222f1e78   0x7ffd222f1e78

ret
rax            0x1  1
rbp            0x7ffd222f1e80   0x7ffd222f1e80
rsp            0x7ffd222f1e80   0x7ffd222f1e80

// стек

-----------------
0x7ffd222f1e70
-----------------
0x7ffd222f1e78
-----------------
0x7ffd222f1e80
-----------------

1 Ответ

0 голосов
/ 29 октября 2019

Я понял, что не правильно понял инструкции "call", "pop" и "ret". Теперь я думаю, что понимаю это.

enter image description here

enter image description here

Процедуры и стеки вызовов
https://courses.cs.washington.edu/courses/cse351/12au/lecture-slides/07-procedures.pdf

1 перед вызовом f ():

rax            0x55ce8dc245fa   94345629943290
rbp            0x7fff30b035b0   0x7fff30b035b0
rsp            0x7fff30b035b0   0x7fff30b035b0
rip            0x55ce8dc245fe   0x55ce8dc245fe <main+4>

--------------|--------------
ADDRESS       |VALUE
--------------|--------------
0x7fff30b035b0|               <= rsp, rbp
--------------|--------------

2 начать вызов f ():

rax            0x0  0
rbp            0x7fff30b035b0   0x7fff30b035b0
rsp            0x7fff30b035a8   0x7fff30b035a8
rip            0x55ce8dc2460a   0x55ce8dc2460a <f>

--------------|--------------
ADDRESS       |VALUE
--------------|--------------
0x7fff30b035b0|               <= rbp
--------------|--------------
0x7fff30b035a8|0x55ce8dc245fe <= rsp
--------------|--------------

3 push% rbp:

rax            0x0  0
rbp            0x7fff30b035b0   0x7fff30b035b0
rsp            0x7fff30b035a0   0x7fff30b035a0
rip            0x55ce8dc2460e   0x55ce8dc2460e <f+4>

--------------|--------------
ADDRESS       |VALUE
--------------|--------------
0x7fff30b035b0|               <= rbp
--------------|--------------
0x7fff30b035a8|0x55ce8dc245fe
--------------|--------------
0x7fff30b035a0|0x7fff30b035b0 <= rsp
--------------|--------------

4 mov% rsp,% rbp:

rax            0x0  0
rbp            0x7fff30b035a0   0x7fff30b035a0
rsp            0x7fff30b035a0   0x7fff30b035a0
rip            0x55ce8dc2460e   0x55ce8dc2460e <f+4>

--------------|--------------
ADDRESS       |VALUE
--------------|--------------
0x7fff30b035b0|
--------------|--------------
0x7fff30b035a8|0x55ce8dc245fe
--------------|--------------
0x7fff30b035a0|0x7fff30b035b0 <= rsp, rbp
--------------|--------------

5 mov $ 1,% eax:

rax            0x1  1
rbp            0x7fff30b035a0   0x7fff30b035a0
rsp            0x7fff30b035a0   0x7fff30b035a0
rip            0x55ce8dc24613   0x55ce8dc24613 <f+9>

--------------|--------------
ADDRESS       |VALUE
--------------|--------------
0x7fff30b035b0|
--------------|--------------
0x7fff30b035a8|0x55ce8dc245fe
--------------|--------------
0x7fff30b035a0|0x7fff30b035b0 <= rsp, rbp
--------------|--------------

6 отпуск: (mov% rbp% rsp, pop%rbp)

rax            0x1  1
rbp            0x7fff30b035b0   0x7fff30b035b0
rsp            0x7fff30b035a8   0x7fff30b035a8
rip            0x55ce8dc24614   0x55ce8dc24614 <f+10>

--------------|--------------
ADDRESS       |VALUE
--------------|--------------
0x7fff30b035b0|               <= rbp
--------------|--------------
0x7fff30b035a8|0x55ce8dc245fe <= rsp
--------------|--------------

7 рет:

rax            0x1  1
rbp            0x7fff30b035b0   0x7fff30b035b0
rsp            0x7fff30b035b0   0x7fff30b035b0
rip            0x55ce8dc24608   0x55ce8dc24608 <main+14>

--------------|--------------
ADDRESS       |VALUE
--------------|--------------
0x7fff30b035b0|               <= rbp, rsp
--------------|--------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...