2011-08-08 158 views
2

我正在編寫一個編譯器 - 只是爲了好玩並提高我的技能。我想實現一個C語言的子集。問題是:我正在編譯名爲Sextium II的理論16位RISC處理器(我們曾經在我們的大學教過它的彙編器)的彙編器。僅通過ADD,SUB,MUL和DIV指令來實現位操作

該處理器只使用16個命令,並且它們都不是一個位操作。我想實現C位運算符 - 之後是半精度浮點數 - 但我不知道如何僅使用ADDSUBMULDIV指令來執行位操作。位移很容易,它只是乘以或除以2^n,其中n是移位長度。但是AND,OR,NOTXOR呢?

編輯 要清楚:處理器只計算16位有符號的U2運算。

+0

它會變慢,但x AND 1是x MOD 2,每次使用循環和移位可以構造一個16位的AND。 1位x OR y是(x AND 1)|| (y AND 1)(我假設你已經實現了這個),再次循環會給你一個16位版本。 XOR和NOT類似。我相信這可以通過更智能的方式完成,但這可以作爲後備工作。 – user786653

回答

1

那麼,如果你看一個按位真值表添加例如:

a b c r 
0 0 0 0 
0 1 0 1 
1 0 0 1 
1 1 1 0 

a和b是輸入操作數R是結果c是開展。

從按位觀點來看,add是一個xor。但要將它用作通用異或,您需要執行16次添加操作,每個位添加一個操作,以及掩蓋一個操作數並提取結果位的所有工作。

a b c r 
0 1 0 1 
1 1 1 0 

把焦點放在再次添加,但與b操作數總是一個,你會得到一個沒有功能。這裏又需要掩蔽和轉移。

當然你沒有掩飾和移位嗎?

乘數將向左移位,次數2是移位1次4移位2等等。同樣的分歧是一個轉變的權利。除以4是2的換算,除以8是3的換算等等。你可以用這種方法來屏蔽各個位,用8除以右移3然後乘以0x8000左移15,然後除以0x1000。這將和0x0008一樣嗎?

如果這樣工作,那麼你可以說乘以0x100然後除以0x100,並且與0xFF00相同。

它是一個有符號乘法(和除法)還是無符號?或者你有兩個?

+0

所有操作都是在16位有符號U2運算上進行的。 – Archie

+0

當符號位參與時,這可能會改變乘法和除法的情況。例如,0x8000 * 0x7FFF的無符號乘法爲0x3FFF8000,其中0x8000 * 0x7FFF的有符號乘法爲0xC0008000。你可能沒有16位* 16位= 32位的結果,所以這兩個看起來可能相同(並且實際上做我希望他們會做的),但將0x8000除以0x1000給出0x0008無符號和0xFFF8簽名。 –

+0

謝謝。我認爲會有一些黑客讓事情變得更快,但顯然沒有。我會接受你的回答。 – Archie