鱼C论坛

 找回密码
 立即注册
查看: 2249|回复: 3

[技术交流] 用汇编的角度来看前自增和后自增

[复制链接]
发表于 2017-2-6 00:12:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天有点无聊,于是就复习了一下以前的知识 (=。=);

于是我就看了看前自增后后自增,一开始的时候有点忘记了; 但最后还是想起来了;

好了,话不多说,接下来让我们从汇编的角度来分析一下C语言吧;



ascrip C0JD7UG3$H~GU6D{J`M9E@N.png t:;

如图:嘻嘻 ;


首先我们来分析一下第一条汇编程序    默认i的内容为0

------------------------------------------------i++-------------------------------------------------------------------------------
1.把i的内容从内存赋值到eax寄存器中                                                                             | mov  eax,dword ptr[i]

2.把eax寄存器的值加1,ps:其实这一步根据我对汇编的理解 可以优化为 inc eax            |add   eax,1

3.把加1后的eax寄存器的值放回到i的内存中                                                                     |mov   dword ptr[i],eax

-----------------------------------------------++i---------------------------------------------------------------------------------
4.把i的内容从内存赋值到ecx寄存器中                                                                            |mov    eax,dword ptr[i]

5.把ecx的值赋值给[ebp - 0DCh]内存中 ,ps:此处相当于创建了一个副本                     |mov   dword ptr[ebp - 0DCh],eax

6.把i的内容从内存中赋值到edx寄存器中                                                                        |mov   edx,dword ptr[i]

7.把edx寄存器的值加1                                                                                                    |add   edx,1

8.把加1后的edx寄存器的值放回到i的内存中                                                                    |mov   dword ptr[i],edx

--------------------------------------------------接下来就是输出了(重点)-----------------------------------------------------
9.把i的内存从内存给eax                                                                                                     |mvo    eax,dword prt[i]

10.eax入栈                                                                                                                     |push eax

11.把[ebp - 0DCh]内存中的值赋值给ecx                                                                         |mov ecx dword ptr[ebp - 0DCh]

12ecx入栈                                                                                                                |push ecx

因为栈是一个先进后出的存放体系,所以在遇到第一个 %d的时候就会弹出第二个入栈的值 此时屏幕上会显示 i++= 2
然后遇到第二个%d的时候就会弹出第一个入栈的值 此时屏幕上会显示 i++ = 2   ++i = 1

在这里我们可以看出后置的++给出的仅仅是一个副本

好了分析完了,不足之处请大家多多指出!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-6 16:43:29 | 显示全部楼层
我当年也是这么干的,nice 哟
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-7 00:49:52 | 显示全部楼层
零度非安全 发表于 2017-2-6 16:43
我当年也是这么干的,nice 哟

哈哈哈哈 , 同道中人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-2-10 00:14:27 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表