用汇编语言减去 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 的补码的主要内容,如果未能解决你的问题,请参考以下文章