2012-03-20 95 views
6

我剛剛在IDA Pro中打開了一個文件,發現一些看起來完全沒用的代碼。但是,我認爲它可能有一些用處。 sub eax,0只是從eax中減去0?sub eax,0 - 它執行任何操作嗎?

的代碼:

hinstDLL= dword ptr 4 
fdwReason= dword ptr 8 
lpReserved= dword ptr 0Ch 

mov  eax, [esp+fdwReason] 
sub  eax, 0 
jz  short loc_10001038 
+3

是的,它從eax中減去零。但那*做了一些事情,它設置了標誌。例如,它將導致零的唯一方法是,如果eax是零開始的。 – harold 2012-03-20 17:08:13

回答

13

sub指令設置標誌(OFSFZFAFPF,和CF,根據documentation) - 的指令mov沒有。只有零標誌(ZF)被設置時,jz纔會跳轉,所以如果你想根據eax中的值跳轉,那麼必須正確設置標誌。

+0

我以爲你需要使用TEST指令。謝謝! – 2012-03-20 17:16:13

+1

'test'確實按位進行隱式AND,但不會影響所有相同的標誌。從'test'文件中:'OF'和'CF'標誌設置爲'0'。'SF','ZF'和'PF'標誌根據結果設置。 'AF'標誌未定義。「 – 2012-03-20 17:17:17

6

sub指令將設置零標誌,如果其結果爲零。在這種情況下,這意味着如果eax爲零,則將設置零標誌。

因此,這三條指令檢查[esp+fdwReason]是否爲零,並在該情況下跳轉到loc_10001038

相關問題