为什么push指令会改变rsp的值?

9 浏览
0 Comments

为什么push指令会改变rsp的值?

这个问题已经有答案了:

汇编中的push和pop如何工作

汇编语言中堆栈是如何工作的?

哪些x86指令会影响ESP作为副作用?

我正在检查来自Erickson的《黑客:利用技术的艺术》中的这段代码片段:

void test_function(int a, int b, int c, int d) {
        int flag;
        char buffer[10];
        flag = 31337;
        buffer[0] = 'A';
}
int main() {
        test_function(1, 2, 3, 4); 
}

gcc -g stack_example.c
gdb -q ./a.out
gef➤list main
     0x555555555192 <main+0>         endbr64 
       0x555555555196 <main+4>         push   rbp
       0x555555555197 <main+5>         mov    rbp, rsp
     → 0x55555555519a <main+8>         mov    ecx, 0x4
       0x55555555519f <main+13>        mov    edx, 0x3
       0x5555555551a4 <main+18>        mov    esi, 0x2
       0x5555555551a9 <main+23>        mov    edi, 0x1
       0x5555555551ae <main+28>        call   0x555555555149 
       0x5555555551b3 <main+33>        mov    eax, 0x0

我在主函数和test_function处设置断点。

当我在主函数中断点时,我得到以下输出:

gef➤  i r rsp rbp rip
    rsp            0x7fffffffdfc8      0x7fffffffdfc8
    rbp            0x0                 0x0
    rip            0x555555555192      0x555555555192

gef➤ x/8i $rip 0x555555555192
: endbr64 0x555555555196 <main+4>: push rbp 0x555555555197 <main+5>: mov rbp,rsp 0x55555555519a <main+8>: mov ecx,0x4 0x55555555519f <main+13>: mov edx,0x3 0x5555555551a4 <main+18>: mov esi,0x2 0x5555555551a9 <main+23>: mov edi,0x1 0x5555555551ae <main+28>: call 0x555555555149 gef➤continue

现在当我在test_function处断点时,寄存器包含:

gef➤  i r rsp rbp rip
    **rsp            0x7fffffffdfc0      0x7fffffffdfc0**
    **rbp            0x7fffffffdfc0      0x7fffffffdfc0**
    rip            0x55555555519a      0x55555555519a <main+8>

我的问题是,为什么指令执行后,寄存器rsp的值从0x7fffffffdfc8更改为0x7fffffffdfc0

    0x555555555196 <main+4>         push   rbp
    0x555555555197 <main+5>         mov    rbp, rsp

admin 更改状态以发布 2023年5月23日
0
0 Comments

push rbp指令与sub rsp, 8; mov QWORD PTR[rsp], rbp;实现的功能相同。它首先将堆栈指针(rsp)向上移动8个字节(这是因为在x86-64中,寄存器的大小为8个字节,即64位),然后将内存位置指向的寄存器的值移动到堆栈中。因此,rsp的值,原来是0x7fffffffdfc8,现在变成了0x7fffffffdfc0,比之前少8个字节。

0