2017-07-05 43 views
0

我正在實現一個自定義的16位cpu(在Verilog中)。如果我需要實現溢出標誌來處理簽名比較,那麼我會遇到麻煩。簽名比較中需要溢出標誌嗎?

在我目前的執行情況,我只檢查零的結果和標誌位來確定結果的比較:

when comparing x to y the ALU calculates: x - y (2's compl) 
If the sign bit is set and the result is not zero y > x 
If the sign bit is not set and the result is not zero x > y 

我不使用溢出標誌來確定結果的比較。我已經爲x和y嘗試了許多不同的值,並且它們都是正確的。

可以簽名比較是否實現沒有溢出標誌?如果不是,你能否給我x和y的值,以這種方式給出錯誤的結果?

+0

你試過了什麼樣的數字? – EOF

+0

@EOF f.e. 0xa000(-24k)和0xb000(-20k)。和0xf000,0xff00,0x8000,0x7000,0x8400,0x0f00,0x1700,0xf000 ... – ErwinM

+0

的大多數組合您是否嘗試過'INT_MIN'('0x8000')和'1'('0x1')? 'INT_MIN - 1'將溢出並創建'INT_MAX'('0x7FFF'),它非零且沒有符號位設置,根據您的表,它會指示INT_MIN> 1。 – EOF

回答

0

首先:

「sign」位不幫你檢查x> y。你還需要「攜帶」位,你可以使用8位無符號運算看到:(更換「132」,由「-124」,你看,它也不會簽署算術工作)

132 - 2 = 130 (sign bit set, carry clear) 
132 - 6 = 126 (sign bit clear, carry clear) 
6 - 132 = 130 (sign bit set, carry set) 
2 - 132 = 126 (sign bit clear, carry set) 

您的實際問題:

這取決於,正是你要問:

如果能夠設計出僅具有一個指令集,允許無符號比較,可以做簽署比較CPU:

在這種情況下答案是肯定的 - 因爲你可以在評論中看到你的答案。在執行CMP操作之前,只需簡單地顛倒兩個數字的最高位(使用XOR操作)即可。

如果你想知道你有多少「標誌」位需要那麼根據簽訂的比較條件跳轉是可能的(只有)一個CMP指令和條件跳轉指令:

您將需要至少3個標誌:「Zero」,「Carry」和第三個標誌允許你計算「Sign XOR Overflow」的值。

(所以你可能會使用「SignXorOverflow」標誌。)

由於「溢出」不能從「零」計算,「進位」和「註冊」,您將需要「溢出」位,如果你想擁有「Sign」位。