用汇编语言减去 16 位 2 的补码

Posted

技术标签:

【中文标题】用汇编语言减去 16 位 2 的补码【英文标题】:Subtracting 16-bit 2's compliment numbers in assembly language 【发布时间】:2020-12-09 03:16:34 【问题描述】:

我正在尝试构建一个计算机芯片,类似于在 nand2tetris 上发现的 Add16 芯片,它减去 16 而不是添加它。但是,我不断遇到不正确的结果。有人可以帮我吗?

Chip Sub16 
IN a[16], b[16];
OUT out[16];

PARTS:
Not16(in=b, out=subB);
Add16(a=a, b=notB, out=out);

我也试过这个版本:

Not(in=b[0], out=out0);
FullAdder(a=a[0], b=out0, c=false, sum=out[0], carry=c1);
Not(in=b[1], out=out1);
FullAdder(a=a[1], b=out1, c=c1, sum=out[1], carry=c2);

...

以此类推,数字每一步都在变大,达到 16 个。期望的结果如下:

任何可以提供的帮助将不胜感激!

【问题讨论】:

可以点击链接进入图片。 不要通过删除尝试的代码来破坏您的问题。 【参考方案1】:

A-B 有几个公式。

一个是 A + ~B + 1。

另一个是~(~A + B)。后者是 HACK ALU 使用的(见https://b1391bd6-da3d-477d-8c01-38cdf774495a.filesusr.com/ugd/56440f_2e6113c60ec34ed0bc2035c9d1313066.pdf)

对于专用功能单元,第一个公式更好,因为您可以“免费”获得 +1;您只需要一个稍加修改的 16 位加法器和一个 16 位非单元。我会让你弄清楚它是如何完成的。

玩得开心!

【讨论】:

以上是关于用汇编语言减去 16 位 2 的补码的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中为啥int型的取值范围是-32768~32767

16位汇编第六讲汇编指令详解第二讲

将十六进制数转换为2的补码。

补码详细分析和汇编下的使用

Python 将一个值转换为 16 位 2 的补码

C语言 原码--反码--补码