一篇簡單的匯編指令閱讀

直接上代碼如下:

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    // 子程序的返回指令

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容