这是我在 godbolt 编译器上编写的一个基本程序,它很简单:
#include<stdio.h>
void main()
{
int a = 10;
int *p = &a;
printf("%d", *p);
}
Run Code Online (Sandbox Code Playgroud)
编译后我得到的结果:
.LC0:
.string "%d"
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-12], 10
lea rax, [rbp-12]
mov QWORD PTR [rbp-8], rax
mov rax, QWORD PTR [rbp-8]
mov eax, DWORD PTR [rax]
mov esi, eax
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
nop
leave
ret
Run Code Online (Sandbox Code Playgroud)
问题:推送 rbp,通过创建 16 字节块来创建堆栈帧,如何从寄存器将值移动到堆栈位置,反之亦然,LEA 的工作是如何计算出地址,我得到了这部分。
问题:
lea rax, [rbp-12]
mov QWORD …Run Code Online (Sandbox Code Playgroud)