2013-03-16 46 views
3

目前,我這樣做是爲了測試在x86彙編(R/M32,imm8指定)一個負數:在x86程序集中測試負數的最緊湊方法?

83F800 CMP EAX, 0 

這可以跟JL。這是3個字節,據推測時鐘爲「1/2」。我可以使用TEST EAX或CMP EAX,imm32(編碼3D),兩者的時鐘都是「1」,但是需要5個字節。一般來說,如果我想盡量減少代碼的大小,我的方式正確嗎?再一次,這是爲了測試一個數字是否小於零。

+0

什麼微時間的時間? – harold 2013-03-16 19:38:09

+0

如果你使用'JS'(「jump if sign」),你可以在很多情況下跳過'CMP'。符號標誌_should_已經被最後的算術或移動指令正確設置,並且如果符號標誌被設置,結果是否定的。雖然可能出現奇怪的特殊情況,但這種情況在某些不明的原因下不起作用。 – Damon 2013-03-16 19:40:46

+0

@Damon移動不會改變標誌雖然 – harold 2013-03-16 19:41:28

回答

2

add eax, eax只有兩個字節(01 C003 C0),但具有破壞性。 (之後檢查進位)

test eax, eax也只有兩個字節(85 C0)。 (檢查是否有跡象之後)

+0

好吧,所以如果我使用測試,那麼JL將工作?根據我的書JL去如果SF <> OF,並且由於測試清除OF,那麼我應該可以看起來好。 – 2013-03-16 19:45:46

+0

@TylerDurden是的,但只是意外,可以這麼說,因爲它會清除OF,就像你說的那樣。不妨使用'JS'並使其明顯,對吧? – harold 2013-03-16 19:46:29

+0

我正在使用當前沒有JS的小型彙編程序。 – 2013-03-16 19:52:01

4

您可以使用:

or  eax, eax 

它是一個字節短(只有兩個字節的操作代碼)指令!