我是汇编的新手,我通过将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
在这里,我们将返回值设置为1和popping堆栈并将其值存储在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。它是否会以某种方式自动清理。