![]() |
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)
|
---|
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 |
不負責任猜測...這感覺像是組合語言
cmp byte ptr [rcx+110],01 je player1 這兩行是比對後數值相同,跳往Player1: 區段的程式繼續執行(je就是結果一致時跳躍) 但若比對後數值不同時怎麼辦呢? 再比對一次確認啊! 所以就有後面兩行的出現 cmp byte ptr [rcx+110],01 jne code 這時的jne則是數值不同時跳往code:的程式區段繼續執行下去。 |
再比一次如果不是的話就跳到code:
大概類似這樣吧 代碼:
if(x==01) { goto player1; } if(x!=01) { goto code; } player1: ... return; code: ... return; |
newmem 那段落執行下來,[rcx+110]並沒有被改變 不是嗎...所以我問為什麼要執行兩次?
而且都是比較相同的數值1 |
改變? cmp又不會改變值,只是比較兩個值不是?
只是cmp結果不會儲存... 所以je用過了cmp的結果後, 想要判斷不等於的情況就得再cmp一次, 引用:
|
引用:
可能就寫的時候沒想到吧. 後面那個直接用個 jmp 就可以, 是可以不用 cmp 一次. |
除了可能沒想到,也有可能是慎重起見的作法,
畢竟遊戲還在運行中,存放在記憶體的資料可能隨時發生變動, 慎重一點沒什麼不好,當然您也可以問作者為何要這樣寫, 或許他會有另外的說法也不一定。 引用:
|
所有的時間均為GMT +8。 現在的時間是05:23 AM. |
vBulletin Version 3.0.1
powered_by_vbulletin 2025。