0

我正在开发自己的虚拟 4 位 ALU。我想创建计算器(+、-、*、/、%,只有整数,可能更多位)。我的目标是彻底理解它,而不是构建一个高效的设备。

目前我已经实现了4个功能:

  1. 添加。
  2. 添加一个。
  3. 正转负。
  4. 减法。

在所有函数中,结果的第 5 位被忽略。我想告诉 ALU 是否应该签署结果。最好的方法是什么?

我的想法:

  1. 使用另外 3 个函数(结果是第一个、第二个和第三个无符号整数)。
  2. 再使用一个输入字节(判断是否忽略第 5 位)。

其中哪一个更好?你知道更好的方法吗?

4

2 回答 2

0

如果只使用加法或减法,则不需要添加更多函数。

在有符号的情况下解释不同的数字是很常见的。通常最高位用于确定一个数字是否为负数。在您的 ALU 中,您可以使用从 0 到 15(无符号)或 -8 到 7(有符号)的数字,但这取决于您如何解释它们。加法或减法的逻辑是相同的,不需要。

例如:

  0111 (7)
 +0001 (1)
 =====
  1000 (8)

或者

  1110 (-2)
 +0010 (2)
 =====
  0000 (0)

如您所见,加法对正数的作用与对负数的作用相同。目前未使用的第 5 位可用作下一次加法的进位(将具有较高位数的数字相加)。

于 2013-07-11T17:49:21.297 回答
0

在寄存器中,值只是一组位。

一种选择是您的运算符假定操作数具有某些格式。例如:
-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,但有溢出

于 2013-07-11T17:51:56.717 回答