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
#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
- linx x86 汇编
- x86汇编
- X86 汇编
- x86汇编
- x86汇编
- 简明x86汇编
- x86汇编指令详解
- X86汇编子程序设计
- x86汇编指令(1)
- x86汇编指令(2)
- 80x86 汇编指令
- X86汇编学习中
- x86汇编经验之谈
- X86汇编指令格式
- 80x86汇编小站
- X86汇编学习小结
- x86汇编指令手册
- x86汇编学习资源
- 黑马程序员:在PHP培训界首推Hybird App课程
- 【TJOI2013】单词
- 2016全球大数据战略版图剖析(5):应用篇
- 网络监控平台Shinken
- Android系统Recovery工作原理之使用update.zip升级过程分析(七)---Recovery服务的核心install_package函数
- linx x86 汇编
- 百度语音识别
- 大数据量下高并发同步的解决方案
- win10 Edge都上不了网,但是Chrome可以的解决方法
- 【后台开发科普web系列】css
- Android 设计模式 笔记 - Builder模式
- 【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲
- Android系统Recovery工作原理之使用update.zip升级过程分析(八)---解析并执行升级脚本updater-script
- 矩阵快速幂求Fibonacci数列