(学习笔记_2011_07_03)i++和++i进行条件判断的时候的反汇编.........

if(a++ > 0)

011A16BC  mov        eax,dword ptr [a] 

011A16BF  mov        ecx,dword ptr [a] 

011A16C2  add        ecx,1 

011A16C5  mov        dword ptr [a],ecx 

011A16C8  test       eax,eax       //此处对eax进行and操作.......只影响flags...只知道影响ZF位...但别人说影响OF位还真是不知道怎么影响......当比较的数字不是0而是其他数字的时候会用cmp命令.........置于为什么只有0才用test指令是因为可以通过ZF位直接进行判断...而其他数字不可以....同时两个寄存器的比较比与内存单元和立即数等进行比较要快.....

011A16CA  jle        main+48h (11A16D8h) //根据flags进行跳转....至于为什么要这么做....人人理解是因为条件跳转一般都是用flags进行实现的...当然jmp这些无条件跳转除外...

之所以要先   test   eax, eax   是因为这样做即可以保证原来的数不变...又可以改变flags位...从而进行跳转....以前理解a++和++a老是觉得前面是先判断后加...后面是先加再判断..

关键这一跳......当上面的比较结果是<=0的话...那么就跳转...eax是没有进行加的....所以说是先判断后进行加(准确点不能这么说..因为编译器分开做了)

011A16CC  mov        dword ptr [ebp-0E8h],1 

011A16D6  jmp        main+52h (11A16E2h) 

011A16D8  mov        dword ptr [ebp-0E8h],0 

011A16E2  cmp        dword ptr [ebp-0E8h],0 

011A16E9  je         main+64h (11A16F4h) 

//以上为什么要写成两个寄存器...当你拿一个寄存器来写的时候

//mov  eax, mm

//cmp  eax, 0       按照约定要先判断

//je  xxxxxxx          当你跳转了以后到了另外一个域中在进行加很显然不合适..........所以用两个寄存器...一个进行加法操作...一个进行判断...逻辑上是先判断再进行加....其实在进行判断之前内存中的那个数字已经加1了....

{

b++;

011A16EB  mov        eax,dword ptr [b] 

011A16EE  add        eax,1 

011A16F1  mov        dword ptr [b],eax 

}

 

if(++a > 0)

011A16F4  mov        eax,dword ptr [a] 

011A16F7  add        eax,1 

011A16FA  mov        dword ptr [a],eax 

011A16FD  cmp        dword ptr [a],0 //与零进行比较...结果只改变flags...这里我不是很明白....为什么不可以用 test   eax, eax   ...eax的值没变...而且寄存器进行and比较不是很快很多么?

011A1701  jle        main+7Ch (11A170Ch) //这个好理解...直接加了然后判断.....

{

b++;

011A1703  mov        eax,dword ptr [b] 

011A1706  add        eax,1 

011A1709  mov        dword ptr [b],eax 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值