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
}