2012-10-29 55 views
1

我正在爲它製作一個虛擬機和一個C編譯器。我不明白的是大多數指令集有一個IMUL和IDIV,但不是一個ISUB和一個IADD。由於子通常是無符號的子我怎麼能做一些像在x86Howcome程序集沒有簽名和未簽名的子操作指令?

MOV EAX,1 
MOV EDX,3 
SUB EAX,EDX,EAX 

並得到-2?

+5

你是否熟悉二的補碼? – delnan

+0

FWIW [MIPS](http://en.wikipedia.org/wiki/MIPS_architecture#Integer)確實同時具有無符號和有符號的加法和減法(不同之處在於它們是否檢查是否溢出)。 – user786653

+0

更加有趣的是,用2的補碼,乘法結果的低半部分也與簽名無關。這就是爲什麼沒有隻給出低部分的'mul'版本,'imul'已經這樣做了。 – harold

回答

5

帶符號的加法總是會產生與無符號加法相同的位模式 - 只是對它們的解釋不同 - 所以不需要爲這兩種情況分別指示。減法也是一樣。

一般ADD和SUB指令設置兩組條件標誌,以便稍後可以檢查使用ja/jb進行無符號比較或使用jg/jl進行符號比較的SUB比較結果。

(更準確地說:如果您已經有做無符號加法/減法模2說明^ wordlen,那麼他們生產的將是每2的補正確的位模式簽署加法/減法,其真正的結果是表示的數學這是因爲無符號整數和2的補碼有符號整數只是殘基類模2 ^字長)的典範代表的不同選擇。

+0

當簽名格式使用二進制補碼錶示時,即。 –

+1

@StephenCanon:當然,但是你最後一次看到一個架構使用了不同於2的補碼錶示的有符號整數算術? –

5

每個指令只有一條指令,因爲無論簽名還是無符號的參數,減法和加法都會得到相同的結果。