簡體   English   中英

僅通過ADD,SUB,MUL和DIV指令實現位操作

[英]Implement bit operations only by ADD, SUB, MUL and DIV instructions

我正在編寫一個編譯器 - 只是為了好玩並提高我的技能。 我想實現C語言的一個子集。 問題是:我正在編譯一個名為Sextium II的理論16位RISC處理器的匯編程序(我們曾經在我們的大學教授匯編程序)。

處理器僅使用16個命令,並且它們都不是位操作。 我想實現C位運算符 - 然后是半精度浮點數 - 但我不知道如何僅使用ADDSUBMULDIV指令來實現位操作。 位移很容易,它只是乘法或除以2^n ,其中n是移位長度。 但是, ANDORNOT還是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM