摘要:本文主要向大家介绍了C/C++知识点之解析c语言背后的汇编代码,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
本文主要向大家介绍了C/C++知识点之解析c语言背后的汇编代码,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
很简单的c语言代码,作用是交换两个数:
1 #include <stdio.h>
2
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+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号