PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   疑難雜症區 (https://www.pcdvd.com.tw/forumdisplay.php?f=34)
-   -   cmp 指令執行兩次用意? (https://www.pcdvd.com.tw/showthread.php?t=1188241)

wkm 2021-08-09 08:07 PM

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

substar999 2021-08-09 09:16 PM

不負責任猜測...這感覺像是組合語言

cmp byte ptr [rcx+110],01
je player1

這兩行是比對後數值相同,跳往Player1: 區段的程式繼續執行(je就是結果一致時跳躍)
但若比對後數值不同時怎麼辦呢? 再比對一次確認啊! 所以就有後面兩行的出現

cmp byte ptr [rcx+110],01
jne code

這時的jne則是數值不同時跳往code:的程式區段繼續執行下去。

dkjfso 2021-08-09 09:25 PM

再比一次如果不是的話就跳到code:
大概類似這樣吧
代碼:
if(x==01)
{
	goto player1;
}
if(x!=01)
{
	goto code;
}
player1:
...
return;

code:
...
return;

wkm 2021-08-09 10:25 PM

newmem 那段落執行下來,[rcx+110]並沒有被改變 不是嗎...所以我問為什麼要執行兩次?
而且都是比較相同的數值1

substar999 2021-08-09 11:38 PM

改變? cmp又不會改變值,只是比較兩個值不是?
只是cmp結果不會儲存...
所以je用過了cmp的結果後,
想要判斷不等於的情況就得再cmp一次,

引用:
作者wkm
newmem 那段落執行下來,[rcx+110]並沒有被改變 不是嗎...所以我問為什麼要執行兩次?
而且都是比較相同的數值1

twu2 2021-08-10 07:54 AM

引用:
作者wkm
newmem 那段落執行下來,[rcx+110]並沒有被改變 不是嗎...所以我問為什麼要執行兩次?
而且都是比較相同的數值1

可能就寫的時候沒想到吧.
後面那個直接用個 jmp 就可以, 是可以不用 cmp 一次.

substar999 2021-08-10 10:43 AM

除了可能沒想到,也有可能是慎重起見的作法,
畢竟遊戲還在運行中,存放在記憶體的資料可能隨時發生變動,
慎重一點沒什麼不好,當然您也可以問作者為何要這樣寫,
或許他會有另外的說法也不一定。

引用:
作者wkm
newmem 那段落執行下來,[rcx+110]並沒有被改變 不是嗎...所以我問為什麼要執行兩次?
而且都是比較相同的數值1


所有的時間均為GMT +8。 現在的時間是05:23 AM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。