一篇简单的汇编指令阅读

直接上代码如下:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。