我正在实现一个自定义的16位cpu(在verilog中)。如果我需要实现溢出标志来处理签名的比较,我就无法绕过头。
在我目前的实现中,我只检查零的结果和符号位来确定比较的结果:
when comparing x to y the ALU calculates: x - y (2's compl)
If the sign bit is set and the result is not zero y > x
If the sign bit is not set and the result is not zero x > y
我没有使用溢出标志来确定比较的结果。我已经尝试了许多不同的x和y值,它们都是正确的。
可以在没有溢出标志的情况下实现签名比较吗?如果没有,你能给我x和y的值,这会给出错误的结果吗?
答案 0 :(得分:0)
首先:
"签署" bit无法帮助您检查x>年。你需要"携带"你可以看到使用8位无符号算术:
132 - 2 = 130 (sign bit set, carry clear)
132 - 6 = 126 (sign bit clear, carry clear)
6 - 132 = 130 (sign bit set, carry set)
2 - 132 = 126 (sign bit clear, carry set)
(替换" 132" by" -124"你看它也不会使用带符号算术。)
您的实际问题:
这取决于你想要问的是什么:
如果可以设计一个可以进行带符号比较的CPU,只有一个允许无符号比较的指令集:
在这种情况下,答案是肯定的 - 您可以在评论中阅读答案。在执行XOR
操作之前,只需反转两个数字的最高位(使用CMP
操作)。
如果你想知道有多少" flag"您需要的位,以便(仅)CMP
指令和条件跳转指令可以基于带符号的比较进行条件跳转:
您需要至少3个标志:"零"," Carry"第三个允许您计算值"签署XOR溢出"。
(所以你可以使用" SignXorOverflow"标志。)
因为"溢出"无法从"零"," Carry"和"签署"你将需要"溢出"如果你想拥有" Sign"位。