我正在开发自己的虚拟 4 位 ALU。我想创建计算器(+、-、*、/、%,只有整数,可能更多位)。我的目标是彻底理解它,而不是构建一个高效的设备。
目前我已经实现了4个功能:
- 添加。
- 添加一个。
- 正转负。
- 减法。
在所有函数中,结果的第 5 位被忽略。我想告诉 ALU 是否应该签署结果。最好的方法是什么?
我的想法:
- 使用另外 3 个函数(结果是第一个、第二个和第三个无符号整数)。
- 再使用一个输入字节(判断是否忽略第 5 位)。
其中哪一个更好?你知道更好的方法吗?
如果只使用加法或减法,则不需要添加更多函数。
在有符号的情况下解释不同的数字是很常见的。通常最高位用于确定一个数字是否为负数。在您的 ALU 中,您可以使用从 0 到 15(无符号)或 -8 到 7(有符号)的数字,但这取决于您如何解释它们。加法或减法的逻辑是相同的,不需要。
例如:
0111 (7)
+0001 (1)
=====
1000 (8)
或者
1110 (-2)
+0010 (2)
=====
0000 (0)
如您所见,加法对正数的作用与对负数的作用相同。目前未使用的第 5 位可用作下一次加法的进位(将具有较高位数的数字相加)。
在寄存器中,值只是一组位。
一种选择是您的运算符假定操作数具有某些格式。例如:
-ADD
可以假设signed big-endian
-UADD
可以假设unsigned little-endian
另一种方法是在一个寄存器组中设置一个位,以表示 ALU 以有符号方式或无符号方式运行。
还可以注意到,对于加法和减法,ALU 知道值是否有符号实际上并不重要。
Binary : Signed Meaning : Unsigned Meaning
----------------------------------------------------
1111 : -1 : 15
0111 : 7 : 7
1111 - 0111 : -1 - 7 : 15 - 7
1000 : -8 : 8
对于加法或减法,不需要知道值是否有符号。
您只需要决定如何处理溢出。
- 1111 + 0111 = 10110
- 在 4 位 ALU 中为 0110,但有溢出