[英]How do the operations LDA, STA, SUB, ADD, MUL and DIV work in Knuth's machine language MIX?
[英]Implement bit operations only by ADD, SUB, MUL and DIV instructions
我正在編寫一個編譯器 - 只是為了好玩並提高我的技能。 我想實現C語言的一個子集。 問題是:我正在編譯一個名為Sextium II的理論16位RISC處理器的匯編程序(我們曾經在我們的大學教授匯編程序)。
處理器僅使用16個命令,並且它們都不是位操作。 我想實現C位運算符 - 然后是半精度浮點數 - 但我不知道如何僅使用ADD
, SUB
, MUL
和DIV
指令來實現位操作。 位移很容易,它只是乘法或除以2^n
,其中n
是移位長度。 但是, AND
, OR
, NOT
還是XOR
呢?
編輯要清楚:處理器僅在16位帶符號的U2算術中計算。
好吧,如果你看一個按位真值表添加例如:
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。 但是要將其用作通用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相同。
是簽名乘法(除法)還是無符號? 或者你們兩個都有?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.