|  | ||
| Senior Member    加入日期: May 2002 
					文章: 1,127
					
				 | 
				
				cmp 指令執行兩次用意?
		
	 我下載國外玩家製作的魔界村ct檔 newmem是比較玩家或敵方 如果是1就是玩家跳至player1:,不是就往下行執行,但再比較一次的用意是什麼??? newmem: cmp byte ptr [rcx+110],01 je player1 cmp byte ptr [rcx+110],01 jne code player1: mov [rbx+78],(float)1 movss xmm0,[rbx+78] jmp return code: movss xmm0,[rbx+78] jmp return PlayerInvincible: jmp newmem 
				__________________ 為了刷存在感,要想這麼多廢文出來發,我真是服了你。 | |||||||
|  2021-08-09, 08:07 PM
			
			
	#1 |   | 
| Master Member     加入日期: Sep 2001 您的住址: K 
					文章: 1,504
					
				 | 不負責任猜測...這感覺像是組合語言 cmp byte ptr [rcx+110],01 je player1 這兩行是比對後數值相同,跳往Player1: 區段的程式繼續執行(je就是結果一致時跳躍) 但若比對後數值不同時怎麼辦呢? 再比對一次確認啊! 所以就有後面兩行的出現 cmp byte ptr [rcx+110],01 jne code 這時的jne則是數值不同時跳往code:的程式區段繼續執行下去。 | ||
|  2021-08-09, 09:16 PM
			
			
	#2 |   | 
| Senior Member    加入日期: Apr 2005 
					文章: 1,209
					
				 | 再比一次如果不是的話就跳到code: 大概類似這樣吧 代碼: if(x==01)
{
	goto player1;
}
if(x!=01)
{
	goto code;
}
player1:
...
return;
code:
...
return; | 
|  2021-08-09, 09:25 PM
			
			
	#3 |   | 
| Senior Member    加入日期: May 2002 
					文章: 1,127
					
				 | newmem 那段落執行下來,[rcx+110]並沒有被改變 不是嗎...所以我問為什麼要執行兩次? 而且都是比較相同的數值1 
				__________________ 為了刷存在感,要想這麼多廢文出來發,我真是服了你。 | 
|  2021-08-09, 10:25 PM
			
			
	#4 |   | 
| Master Member     加入日期: Sep 2001 您的住址: K 
					文章: 1,504
					
				 | 改變? cmp又不會改變值,只是比較兩個值不是? 只是cmp結果不會儲存... 所以je用過了cmp的結果後, 想要判斷不等於的情況就得再cmp一次, 引用: 
 | |
|  2021-08-09, 11:38 PM
			
			
	#5 |   | 
| Power Member   加入日期: Jan 2002 您的住址: Taipei 
					文章: 664
					
				 | 引用: 
 可能就寫的時候沒想到吧. 後面那個直接用個 jmp 就可以, 是可以不用 cmp 一次. 
				__________________   Tommy 碎碎念... | |
|  2021-08-10, 07:54 AM
			
			
	#6 |   | 
| Master Member     加入日期: Sep 2001 您的住址: K 
					文章: 1,504
					
				 | 除了可能沒想到,也有可能是慎重起見的作法, 畢竟遊戲還在運行中,存放在記憶體的資料可能隨時發生變動, 慎重一點沒什麼不好,當然您也可以問作者為何要這樣寫, 或許他會有另外的說法也不一定。 引用: 
 | |
|  2021-08-10, 10:43 AM
			
			
	#7 |   |