我是汇编的新手,我通过将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
。它是否会以某种方式自动清理。