| 
																		
我想再请教一下 分支到分支的规则是什么? 《软件调试》 中第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  ![Angel [A]](/emoticons/emotion-13.gif) ,3  0042DAF4  jmp         main+14Dh (42DAFDh)  0042DAF6  mov         dword ptr  ,4 //----------------------------c 0042DAFD  mov         dword ptr  ![Coffee [C]](/emoticons/emotion-44.gif) ,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注释掉, 观察单步执行流程, 再解开注释观察分支跳转方式, 比较之后, 我观察到了这个规律, 我这样理解是否正确? 因为书中的描述我想不通....只好先以自己的想法理解了, 请张老师指点迷津。 
																		 
																	 |