我想再请教一下 分支到分支的规则是什么? 《软件调试》 中第100页 说 “CPU认为有分支发生的条件执行 JMP Jcc LOOP CALL等, 难道是执行一条这个指令后 就算遇到分支? 我自己修改代码的分支条件,然后调试看结果, 我觉得像是执行跳转 之后就算是遇到分支, JNE 这样的条件判断并不是一定就算分支, 如果条件成立, 实际跳转了, 才算遇到分支, 反之条件不成立, 就没有跳转, 就要等下一个跳转语句。 遇到跳转了, 跳转后中断。 这是我的理解
0042DAD2 mov eax,dword ptr [ebp-14h] 0042DAD5 imul eax,dword ptr [ebp-14h] 0042DAD9 cdq 0042DADA idiv eax,dword ptr [ebp-14h] 0042DADD cmp dword ptr [ebp-14h],eax 0042DAE0 jne main+13Bh (42DAEBh) //----------1 { m=1; 0042DAE2 mov dword ptr [ebp-14h],1
} else 0042DAE9 jmp main+142h (42DAF2h) //-----------2 { m=2; 0042DAEB mov dword ptr [ebp-14h],2
} //End of the code which runs in full speed m*=m; 0042DAF2 mov eax,dword ptr [ebp-14h] //----------3 0042DAF5 imul eax,dword ptr [ebp-14h] 0042DAF9 mov dword ptr [ebp-14h],eax
如上图所示 在1处时, 条件判断的结果是没有跳转(到 m =2出), 而是顺序执行, 执行完m = 1;, 会执行 2处代码, 跳转到3, 此时才算是真的”跳“(飞)了一次, 之后就中断了。 如果将代码修改一下
m=10,n=2; m=n*2-1; if(m==m*m/m) {
} //End of the code which runs in full speed m*=m;
对应汇编为
0042DABA mov dword ptr [ebp-14h],0Ah 0042DAC1 mov dword ptr [ebp-20h],2 m=n*2-1; 0042DAC8 mov eax,dword ptr [ebp-20h] 0042DACB lea ecx,[eax+eax-1] 0042DACF mov dword ptr [ebp-14h],ecx if(m==m*m/m) 0042DAD2 mov eax,dword ptr [ebp-14h] 0042DAD5 imul eax,dword ptr [ebp-14h] 0042DAD9 cdq 0042DADA idiv eax,dword ptr [ebp-14h] 0042DADD cmp dword ptr [ebp-14h],eax 0042DAE0 jne main+156h (42DB06h) //-------------------a { 0042DAE2 mov dword ptr [ebp-14h],1 0042DAEB je main+146h (42DAF6h) //--------------------b 0042DAED mov dword ptr ,3 0042DAF4 jmp main+14Dh (42DAFDh) 0042DAF6 mov dword ptr ,4 //----------------------------c 0042DAFD mov dword ptr ,1
} else 0042DB04 jmp main+15Dh (42DB0Dh) { 0042DB06 mov dword ptr [ebp-14h],2
} //End of the code which runs in full speed m*=m; 0042DB0D mov eax,dword ptr [ebp-14h] 0042DB10 imul eax,dword ptr [ebp-14h] 0042DB14 mov dword ptr [ebp-14h],eax
此时先在a 处 未能跳转, 顺序执行 到 b 处, 跳转到了c处, 跳转后中断。
然后还进行了条件的修改 做了几次试验, 先将WirteMSR注释掉, 观察单步执行流程, 再解开注释观察分支跳转方式, 比较之后, 我观察到了这个规律, 我这样理解是否正确? 因为书中的描述我想不通....只好先以自己的想法理解了, 请张老师指点迷津。
|