用汇编的角度来看前自增和后自增
今天有点无聊,于是就复习了一下以前的知识 (=。=);于是我就看了看前自增后后自增,一开始的时候有点忘记了; 但最后还是想起来了;
好了,话不多说,接下来让我们从汇编的角度来分析一下C语言吧;
{:10_306:}
ascript:;
如图:嘻嘻 ;
首先我们来分析一下第一条汇编程序 默认i的内容为0
------------------------------------------------i++-------------------------------------------------------------------------------
1.把i的内容从内存赋值到eax寄存器中 | moveax,dword ptr
2.把eax寄存器的值加1,ps:其实这一步根据我对汇编的理解 可以优化为 inc eax |add eax,1
3.把加1后的eax寄存器的值放回到i的内存中 |mov dword ptr,eax
-----------------------------------------------++i---------------------------------------------------------------------------------
4.把i的内容从内存赋值到ecx寄存器中 |mov eax,dword ptr
5.把ecx的值赋值给内存中 ,ps:此处相当于创建了一个副本 |mov dword ptr,eax
6.把i的内容从内存中赋值到edx寄存器中 |mov edx,dword ptr
7.把edx寄存器的值加1 |add edx,1
8.把加1后的edx寄存器的值放回到i的内存中 |mov dword ptr,edx
--------------------------------------------------接下来就是输出了(重点)-----------------------------------------------------
9.把i的内存从内存给eax |mvo eax,dword prt
10.eax入栈 |push eax
11.把内存中的值赋值给ecx |mov ecx dword ptr
12ecx入栈 |push ecx
因为栈是一个先进后出的存放体系,所以在遇到第一个 %d的时候就会弹出第二个入栈的值 此时屏幕上会显示 i++= 2
然后遇到第二个%d的时候就会弹出第一个入栈的值 此时屏幕上会显示 i++ = 2 ++i = 1
{:10_247:}
在这里我们可以看出后置的++给出的仅仅是一个副本{:10_244:}
好了分析完了,不足之处请大家多多指出! 我当年也是这么干的,nice 哟{:5_95:} 零度非安全 发表于 2017-2-6 16:43
我当年也是这么干的,nice 哟
哈哈哈哈 , 同道中人{:10_279:} {:10_245:}
页:
[1]