从汇编看自增和自减

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

从汇编看自增(++)和自减(--)
//字体:楷体小四 ANSI编码
看个例子:
#include "stdio.h"
void main()
{
int k;
k=3;
while(k) //A例
{
k=k-1;
printf("%d",k);
}
printf("%d\n",k);///结果2100 最后两个数是一样的
k=3;
while(k--) //B例
{
printf("%d",k);
}
printf("%d\n",k);///结果210-1 最后两个数是不一样的!
}
同样的循环,为什么最后的输出不一样呢,难道B例中是K--在while跳出后又执行了一步? 不是,而是K本身在跳出循环前数据就已经是-1了,为什么?
来对比一下这两句代码的汇编指令,真的很简单的。耐心点
int k;
while(k)
{
k=k-1;
}
A汇编如下:
4: int k=3;
00401028 mov dword ptr [ebp-4],3 //给K赋值
5: while(k)
0040102F cmp dword ptr [ebp-4],0 //和0比较,注意是直接和K的内容比较的
00401033 je main+30h (00401040) //跳出循环
6: {
7: k=k-1; //如果不满足等于0则进行下面的处理。
00401035 mov eax,dword ptr [ebp-4]//把K的内容给寄存器eax,注意只用了一个寄存器
00401038 sub eax,1 //寄存器减1
0040103B mov dword ptr [ebp-4],eax//用寄存器数据改变K的数据
8: }
0040103E jmp main+1Fh (0040102f)//继续去比较 ,正常思路很简单。
9: }
再看这个
int k=3;
while(k--);
B汇编如下:
4: int k=3;
00401028 mov dword ptr [ebp-4],3 //同样先给K赋值
5: while(k--);
0040102F mov eax,dword ptr [ebp-4]//复制一份给寄存器eax
00401032 mov ecx,dword ptr [ebp-4]//复制一份给寄存器ecx(用到了2个寄存器.eax=ecx)
00401035 sub ecx,1 //其中一个ecx去减1,这里eax还没有减1;
00401038 mov dword ptr [ebp-4],ecx//用ecx去改变K数据(注意这还没比较呢K就减1了)
0040103B test eax,eax //再用没减1的eax去和0比较,eax总是慢一拍
0040103D je main+31h (00401041) //如果满足跳出循环
0040103F jmp main+1Fh (0040102f)//否则就继续循环,之后eax才是K的减1后的数据。
6: }
我们看到,例A中实际用来比较的是K本身的数据,而例B中却用的是一个

寄存器eax中的内容,所以当用于判断while条件的的eax等于0时,也就是不
在继续循环时,而实际的K内容早就被ecx覆盖层成-1了,那之后我们对K的所有操作,都是K本身的。也就是为什么后来输出的是-1.
那我想你应该知道上面输出的结果的原因了吧。
最后我们来看--和++问题,在实际应用时。就不要考虑上面那么啰嗦的东西。只要记住顺序就ok了。关键一点就是【--k,k--或++k,k++】是整体,如下
【--在后】
while(k--)
{
printf("%d",k);
}
①while(k) 当K=0,忽略③但②还是要执行。
②k=k-1; 所以--在后,【循环结束后】K总是比判断时数据少1 ,自增多1
③ printf("%d",k);
【--在前】
while(--k)
{
printf("%d",k);
}
①k=k-1;
②while(k) 当K=0,忽略③所以【循环结束后】K和判断时数据一样。
③ printf("%d",k);
++同--
另外例B中的汇编用C的形式写出来就是这样的
int k=3; //先定义一个变量k
int a,b; //找两个寄存器a,b
do
{
a=k; //复制1份给a
b=k; // 再复制1份给b
b=b-1; //其中一个减1
k=b; //去改变K的数据
}
while(a!=0); //用另一个去做比较
printf("%d",k);//输出K


相关文档
最新文档