直接上代碼如下:
int static add(int a, int b)
{
0: 55 push rbp //rbp是指向當(dāng)前棧楨底部的基指針,push rbp指令將寄存器rbp的值推入堆棧。
1: 48 89 e5 mov rbp,rsp //rsp是指向當(dāng)前棧楨頂部的堆棧指針,將堆棧指針rsp的值復(fù)制到基指針rbp -> rbp和rsp現(xiàn)在都指向堆棧的頂部。
4: 89 7d fc mov DWORD PTR [rbp-0x4],edi // DWORD存儲32位數(shù)據(jù),edi存參數(shù)a,在內(nèi)存[rbp-0x4]處(e開頭的寄存器用來存32位數(shù)據(jù))。
7: 89 75 f8 mov DWORD PTR [rbp-0x8],esi // DWORD存儲32位數(shù)據(jù),esi存參數(shù)b,在內(nèi)存[rbp-0x8]處
return a+b;
a: 8b 55 fc mov edx,DWORD PTR [rbp-0x4] // 讀取內(nèi)存[rbp-0x4]處的值,即參數(shù)a。edx=a
d: 8b 45 f8 mov eax,DWORD PTR [rbp-0x8] // 讀取內(nèi)存[rbp-0x8]處的值,即參數(shù)b。eax=b
10: 01 d0 add eax,edx // 對讀取到的進(jìn)行加法操作,eax+=edx;
}
12: 5d pop rbp // 函數(shù)調(diào)用結(jié)束,彈出棧底指針
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的值存在內(nèi)存[rbp-0x4]處
int y = 10;
23: c7 45 f8 0a 00 00 00 mov DWORD PTR [rbp-0x8],0xa // 把10的值存在內(nèi)存[rbp-0x8]處
int u = add(x, y);
2a: 8b 55 f8 mov edx,DWORD PTR [rbp-0x8] // 讀取內(nèi)存[rbp-0x8]處的值賦值給edx
2d: 8b 45 fc mov eax,DWORD PTR [rbp-0x4] // 讀取內(nèi)存[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> // 調(diào)用add函數(shù)方法
39: 89 45 f4 mov DWORD PTR [rbp-0xc],eax // 把eax寄存器里的值,存儲到內(nèi)存[rbp-0xc]處
3c: b8 00 00 00 00 mov eax,0x0 // 將0值賦值給eax
}
41: c9 leave // 函數(shù)結(jié)束
42: c3 ret // 子程序的返回指令