3

我是汇编的新手,我通过将c代码编译为汇编来学习汇编。

对于此c++代码


int foo() {
    bool x = true;
    return 1;
} 

这是生成的汇编代码(英特尔语法)

foo():
        push    rbp
        mov     rbp, rsp
        mov     BYTE PTR [rbp-1], 1
        mov     eax, 1
        pop     rbp
        ret

您可以在此处查看编译器资源管理器链接

在本指令中

        mov     BYTE PTR [rbp-1], 1

我们存储1在堆栈中,它的地址是 [rbp - 1]

  mov    eax, 1
  pop    rbp
  ret

在这里,我们将返回值设置为1popping堆栈并将其值存储在rbp.

我的疑问是我们如何存储1在地址中,[rbp - 1]因为rsp应该总是指向堆栈的顶部(在这种情况下是向下),在这条指令之后mov BYTE PTR [rbp-1], 1,顶部应该是[rbp-1]rsp仍然指向rbp.

是不是正确的代码应该是这样的

   sub rsp, 1
   mov BYTE PTR [rbp - 1], 1

这样,rsp 将始终指向顶部。

[rbp-1]我的第二个疑问是after中存储的值会发生什么ret。它是否会以某种方式自动清理。

4

0 回答 0