Senior Member
加入日期: May 2002
文章: 1,069
|
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
|
Senior Member
加入日期: Sep 2001 您的住址: K
文章: 1,469
|
不負責任猜測...這感覺像是組合語言
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,198
|
再比一次如果不是的話就跳到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,069
|
newmem 那段落執行下來,[rcx+110]並沒有被改變 不是嗎...所以我問為什麼要執行兩次?
而且都是比較相同的數值1
__________________
為了刷存在感,要想這麼多廢文出來發,我真是服了你。 |
2021-08-09, 10:25 PM
#4
|
Senior Member
加入日期: Sep 2001 您的住址: K
文章: 1,469
|
改變? cmp又不會改變值,只是比較兩個值不是?
只是cmp結果不會儲存... 所以je用過了cmp的結果後, 想要判斷不等於的情況就得再cmp一次, 引用:
|
|
2021-08-09, 11:38 PM
#5
|
Power Member
加入日期: Jan 2002 您的住址: Taipei
文章: 660
|
引用:
可能就寫的時候沒想到吧. 後面那個直接用個 jmp 就可以, 是可以不用 cmp 一次.
__________________
Tommy 碎碎念... |
|
2021-08-10, 07:54 AM
#6
|
Senior Member
加入日期: Sep 2001 您的住址: K
文章: 1,469
|
除了可能沒想到,也有可能是慎重起見的作法,
畢竟遊戲還在運行中,存放在記憶體的資料可能隨時發生變動, 慎重一點沒什麼不好,當然您也可以問作者為何要這樣寫, 或許他會有另外的說法也不一定。 引用:
|
|
2021-08-10, 10:43 AM
#7
|