直接上代码如下:
int static add(int a, int b)
{
0: 55 push rbp //rbp是指向当前栈桢底部的基指针,push rbp指令将寄存器rbp的值推入堆栈。
1: 48 89 e5 mov rbp,rsp //rsp是指向当前栈桢顶部的堆栈指针,将堆栈指针rsp的值复制到基指针rbp -> rbp和rsp现在都指向堆栈的顶部。
4: 89 7d fc mov DWORD PTR [rbp-0x4],edi // DWORD存储32位数据,edi存参数a,在内存[rbp-0x4]处(e开头的寄存器用来存32位数据)。
7: 89 75 f8 mov DWORD PTR [rbp-0x8],esi // DWORD存储32位数据,esi存参数b,在内存[rbp-0x8]处
return a+b;
a: 8b 55 fc mov edx,DWORD PTR [rbp-0x4] // 读取内存[rbp-0x4]处的值,即参数a。edx=a
d: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8] // 读取内存[rbp-0x8]处的值,即参数b。eax=b
10: 01 d0 add eax,edx // 对读取到的进行加法操作,eax+=edx;
}
12: 5d pop rbp // 函数调用结束,弹出栈底指针
13: c3 ret // 子程序的返回指令
0000000000000014 <main>:
int main()
{
14: 55 push rbp
15: 48 89 e5 mov rbp,rsp
18: 48 83 ec 10 sub rsp,0x10 // rsp的值减去10,指针值减16
int x = 5;
1c: c7 45 fc 05 00 00 00 mov DWORD PTR [rbp-0x4],0x5 // 把5的值存在内存[rbp-0x4]处
int y = 10;
23: c7 45 f8 0a 00 00 00 mov DWORD PTR [rbp-0x8],0xa // 把10的值存在内存[rbp-0x8]处
int u = add(x, y);
2a: 8b 55 f8 mov edx,DWORD PTR [rbp-0x8] // 读取内存[rbp-0x8]处的值赋值给edx
2d: 8b 45 fc mov eax,DWORD PTR [rbp-0x4] // 读取内存[rbp-0x4]处的值赋值给eax
30: 89 d6 mov esi,edx // 把edx寄存器里的值赋值给esi寄存器的值
32: 89 c7 mov edi,eax // 把eax寄存器里的值赋值给edi寄存器的值
34: e8 c7 ff ff ff call 0 <add> // 调用add函数方法
39: 89 45 f4 mov DWORD PTR [rbp-0xc],eax // 把eax寄存器里的值,存储到内存[rbp-0xc]处
3c: b8 00 00 00 00 mov eax,0x0 // 将0值赋值给eax
}
41: c9 leave // 函数结束
42: c3 ret // 子程序的返回指令