仅通过ADD,SUB,MUL和DIV指令实现位操作

时间:2011-08-08 17:04:28

标签: assembly bitwise-operators

我正在编写一个编译器 - 只是为了好玩并提高我的技能。我想实现C语言的一个子集。问题是:我正在编译一个名为Sextium II的理论16位RISC处理器的汇编程序(我们曾经在我们的大学教过汇编程序)。

处理器仅使用16个命令,并且它们都不是位操作。我想实现C位运算符 - 以及之后的半精度浮点数 - 但我不知道如何仅使用ADDSUBMUL和{{来实现位操作1}}说明。位移非常简单,只需乘以DIV进行乘法或除法,其中2^n是移位长度。但是nANDORNOT呢?

修改 需要明确的是:处理器只能在16位带符号的U2算术中进行计算。

1 个答案:

答案 0 :(得分: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。但要将其用作通用xor,您需要执行16次添加操作,每个位一个,加上屏蔽一个操作数并提取结果位的所有工作。

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

再次关注添加但是b操作数总是一个,你得到一个not函数。在这里,需要掩盖和转移。

当然,你没有掩饰和转移吗?

乘数将向左移动,时间2是1次移位4次移位2,依此类推。同样,鸿沟是右移。除以4是2的移位,除以8是3的移位,依此类推。您可以通过这种方式屏蔽单个位,除以8以向右移3然后乘以0x8000以向左移15,然后除以0x1000。这与和0x0008相同吗?

如果可行,那么你可以说乘以0x100然后除以0x100,并且与0xFF00相同。

是签名乘法(除法)还是无符号?或者你们两个都有?