C/C++知识点之解析c语言背后的汇编代码
小标 2018-11-01 来源 : 阅读 810 评论 0

摘要:本文主要向大家介绍了C/C++知识点之解析c语言背后的汇编代码,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点之解析c语言背后的汇编代码,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。


 很简单的c语言代码,作用是交换两个数:

1 #include <stdio.h>

3 void swap(int * a, int * b) {
4     *a = *a + *b - (*b = *a);
5     return;
6 }

 
汇编代码解析  

  在gcc编译环境下执行, gcc -S  -o test.s test.c 命令生成相关汇编代码。

 1     .file    "test.c"
 2     .text
 3     .globl    _swap
 4     .def    _swap;    .scl    2;    .type    32;    .endef
 5 _swap:
 6 LFB6:
 7     .cfi_startproc
 8     pushl    %ebp
 9     .cfi_def_cfa_offset 8
10     .cfi_offset 5, -8
11     movl    %esp, %ebp
12     .cfi_def_cfa_register 5
13     movl    8(%ebp), %eax          --将a指向的地址放到寄存器eax中
14     movl    (%eax), %edx           --将a指向地址里面的值取出存入寄存器edx
15     movl    12(%ebp), %eax         --将b指向的地址放到寄存器eax中
16     movl    (%eax), %eax           --取出b指向地址里面的值存入寄存器eax中
17     leal    (%edx,%eax), %ecx      --计算*a + *b的值并存入寄存器ecx
18     movl    8(%ebp), %eax          --将a指向的地址放入eax
19     movl    (%eax), %edx           --取出a指向地址里面的值放入edx
20     movl    12(%ebp), %eax         --将b指向的地址放入eax 
21     movl    %edx, (%eax)           --用a指向地址里面的值覆盖b指向的地址里面的值. ps:(*b = *a)
22     movl    12(%ebp), %eax         --将b指向的地址放入eax
23     movl    (%eax), %eax           --将b指向地址里面的值放入eax (ps:此时b指向的地址中存的值为a)
24     subl    %eax, %ecx             --用*a+*b的值减去b指向地址里面的值 (ps:此时b指向的地址里面的值为初始时的*a) ,结果(此时结果等于初始时b指针指向的值*b)存在ecx中
25     movl    %ecx, %edx             --将最终结果放入edx
26     movl    8(%ebp), %eax          --将a指针地址放入eax 
27     movl    %edx, (%eax)           --将a指针指向的值改为edx中的最终结果 ps: 此时a指针指向的值为初始时的*b,b指针指向的值为初始时的*a,a,b指针指向的结果已经互换过来了。
28     nop
29     popl    %ebp
30     .cfi_restore 5
31     .cfi_def_cfa 4, 4
32     ret
33     .cfi_endproc
34 LFE6:
35     .ident    "GCC: (GNU) 4.8.1"

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程