最近突然对c语言,以及c语言如何转换到汇编语言特别的感兴趣,于是写了这个系列,首先让我们看一个小程序:
using namespace std;
int main(){
int s;
int a=3;
int b=4;
s=a+b;
return 0;
}
这是个很简单c++程序,仅仅把两个局部变量相加而已,我们汇编这段代码:
g++ -S add.cc -o add.s
以上命令就是把add.cc这个c++源文件汇编成了add.s这个汇编源文件.这个时候我们查看add.s这个文件,里面有一段汇编程序如下:
pushq %rbp
movq %rsp, %rbp
movl $3, -12(%rbp)
movl $4, -8(%rbp)
movl -8(%rbp), %eax
movl -12(%rbp), %edx
addl %edx, %eax
movl %eax, -4(%rbp)
movl $0, %eax
popq %rbp
ret
首先我们看我们感兴趣两个汇编指令:
movl $3, -12(%rbp) ##a=3
movl $4, -8(%rbp) ##b=4
这两句完成了局部变量的赋值操作,这个rbp为base pointer基址指针寄存器,保存了该函数栈空间的一个快照sanshot. -12(%rbp)为栈空间向下12个字节位置的内存地址, movl为移动一个long word(32 bytes)的数值.因此,从rbp-12,rbp-11,rbp-10,rbp-9这4个byte将被赋值为32位的3.注意在int