linx x86 汇编

来源:互联网 发布:ubuntu挂载文件 编辑:程序博客网 时间:2024/06/06 00:22
0000000000400474 <add>:
#include <stdio.h>


int add(int x, int y)
{
  400474:       55                      push   %rbp
  400475:       48 89 e5                mov    %rsp,%rbp
  400478:       89 7d ec                mov    %edi,-0x14(%rbp)  //main函数中已经将将参数a和b 保存到edi和esi中
  40047b:       89 75 e8                mov    %esi,-0x18(%rbp)  //将参数保存到栈中,为啥不直接运算?
        int sum = 0;
  40047e:       c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp) //初始化sum,内存在rbp -4的地方


        sum = x + y;
  400485:       8b 45 e8                mov    -0x18(%rbp),%eax//将参数移动到eax edx
  400488:       8b 55 ec                mov    -0x14(%rbp),%edx
  40048b:       8d 04 02                lea    (%rdx,%rax,1),%eax //加法运算,运算结果在eax中
  40048e:       89 45 fc                mov    %eax,-0x4(%rbp)//将运算结果保存在到rbp-4的地方


        return sum;
  400491:       8b 45 fc                mov    -0x4(%rbp),%eax//eax是函数参数返回寄存器吗?
}
  400494:       c9                      leaveq
  400495:       c3                      retq


0000000000400496 <main>:
int main()
{
  400496:       55                      push   %rbp        //保存调main前的栈低
  400497:       48 89 e5                mov    %rsp,%rbp   //将Main的栈底赋值给rbp 
  40049a:       48 83 ec 10             sub    $0x10,%rsp  //栈上预留空间
        int a = 1;
  40049e:       c7 45 f8 01 00 00 00    movl   $0x1,-0x8(%rbp) //将变量b保存在rbp - 8的地址上
        int b = 2;
  4004a5:       c7 45 fc 02 00 00 00    movl   $0x2,-0x4(%rbp) //将变量a保存在rbp - 4的地址上
        return add(a,b);
  4004ac:       8b 55 fc                mov    -0x4(%rbp),%edx //将a移动到edx
  4004af:       8b 45 f8                mov    -0x8(%rbp),%eax //将b移动到eax
  4004b2:       89 d6                   mov    %edx,%esi //将edx移动到esi
  4004b4:       89 c7                   mov    %eax,%edi //将eax移动到edi
//esi edi 是参数寄存器地址吗?用来传递参数?
  4004b6:       e8 b9 ff ff ff          callq  400474 <add>//条用add函数
}
  4004bb:       c9                      leaveq
  4004bc:       c3                      retq
  4004bd:       90                      nop
  4004be:       90                      nop
  4004bf:       90                      nop
  
  
  
  
  
  0000000000400474 <add>:
#include <stdio.h>


int add(int x1, int x2,int x3, int x4, int x5, int x6)
{
//a  edi  b esi c edx d ecx e r8d f r9d
  400474:       55                      push   %rbp
  400475:       48 89 e5                mov    %rsp,%rbp
  400478:       89 7d ec                mov    %edi,-0x14(%rbp) //a
  40047b:       89 75 e8                mov    %esi,-0x18(%rbp) //b
  40047e:       89 55 e4                mov    %edx,-0x1c(%rbp) //c
  400481:       89 4d e0                mov    %ecx,-0x20(%rbp) //d
  400484:       44 89 45 dc             mov    %r8d,-0x24(%rbp) //e
  400488:       44 89 4d d8             mov    %r9d,-0x28(%rbp) //f
        int sum = 0;
  40048c:       c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)


        sum = x1 + x2 + x3 + x4 +x5 +x6;
  400493:       8b 45 e8                mov    -0x18(%rbp),%eax  //a 到eax
  400496:       8b 55 ec                mov    -0x14(%rbp),%edx  //b 到ebx 
  400499:       8d 04 02                lea    (%rdx,%rax,1),%eax //a+b
  40049c:       03 45 e4                add    -0x1c(%rbp),%eax   //a+b+c
  40049f:       03 45 e0                add    -0x20(%rbp),%eax   //a+b+c+d
  4004a2:       03 45 dc                add    -0x24(%rbp),%eax   //a+b+c+d+e
  4004a5:       03 45 d8                add    -0x28(%rbp),%eax   //a+b+c+d+e+f
  4004a8:       89 45 fc                mov    %eax,-0x4(%rbp)    //eax是作为返回寄存器


        return sum;
  4004ab:       8b 45 fc                mov    -0x4(%rbp),%eax
}
  4004ae:       c9                      leaveq 
  4004af:       c3                      retq   


00000000004004b0 <main>:
int main()
{
  4004b0:       55                      push   %rbp
  4004b1:       48 89 e5                mov    %rsp,%rbp
  4004b4:       53                      push   %rbx
  4004b5:       48 83 ec 20             sub    $0x20,%rsp
        int a = 1;
  4004b9:       c7 45 e0 01 00 00 00    movl   $0x1,-0x20(%rbp)
        int b = 2;
  4004c0:       c7 45 e4 02 00 00 00    movl   $0x2,-0x1c(%rbp)
        int c = 3;
  4004c7:       c7 45 e8 03 00 00 00    movl   $0x3,-0x18(%rbp)
        int d = 4;
  4004ce:       c7 45 ec 04 00 00 00    movl   $0x4,-0x14(%rbp)
        int e = 5;
  4004d5:       c7 45 f0 05 00 00 00    movl   $0x5,-0x10(%rbp)
        int f = 6;
  4004dc:       c7 45 f4 06 00 00 00    movl   $0x6,-0xc(%rbp)
        return add(a,b,c,d,e,f);
  4004e3:       8b 7d f4                mov    -0xc(%rbp),%edi  //f保存在edi
  4004e6:       8b 75 f0                mov    -0x10(%rbp),%esi //e保存在esi
  4004e9:       8b 4d ec                mov    -0x14(%rbp),%ecx //d保存在ecx
  4004ec:       8b 55 e8                mov    -0x18(%rbp),%edx //c保存在edx
  4004ef:       8b 5d e4                mov    -0x1c(%rbp),%ebx//b保存在ebx
  4004f2:       8b 45 e0                mov    -0x20(%rbp),%eax//a保存在eax
  4004f5:       41 89 f9                mov    %edi,%r9d //将f转存到r9d
  4004f8:       41 89 f0                mov    %esi,%r8d //将e转存到r8d
  4004fb:       89 de                   mov    %ebx,%esi //将b保存到esi
  4004fd:       89 c7                   mov    %eax,%edi //将a保存到edi  
//a  edi  b esi c edx d ecx e r8d f r9d
//这里为什么要空出ebx和eax?
  4004ff:       e8 70 ff ff ff          callq  400474 <add>
}
  400504:       48 83 c4 20             add    $0x20,%rsp
  400508:       5b                      pop    %rbx
  400509:       c9                      leaveq 
  40050a:       c3                      retq   
  40050b:       90                      nop
  40050c:       90                      nop
  40050d:       90                      nop
  40050e:       90                      nop
  40050f:       90                      nop
0 0