使用加法器实现减法

《自己动手写CPU》一书中,MIPS32的减法指令SUB和SUBU与加法指令一起实现。

书中的方法是(示例代码,不严谨):

reg2_mux = (是减法指令)  ?  ( ~reg2 + 1 ) : reg2 ;

result = reg1 + reg2_mux ;

对这个处理方法,书中将 ~reg2+1 称为 reg2 的补码。

补码的定义中,最高位是符号位,且原码转补码的过程中符号位不需要取反,而且有符号正整数的补码就是原码。

所以这里直接将 ~reg2+1 称为 reg2 的补码并不准确。

这里使用加法器实现减法的原理如下:

假设有n位寄存器A、B保存了无符号数a、b。需要执行 a-b 计算。

那么 a-b 可以看做 a+(-b)。

B寄存器保存的了b,那么对B寄存器取反得到的值是 2n-1-b,也就是 ~B = 2n-1-b,也就有 -b = ~B+1-2n

因此 a+(-b) 可以由寄存器A、B执行 A+(~B)+1-2n得到。这里-2n明显超出A、B的取值范围,对加法器的运算结果没有影响(对加法器溢出标志位有影响,这里不再讨论)。

因此可以将 a-b 的运算,通过 A+(~B)+1的方法实现。也就是通过加法器实现了减法,而这个操作本身只是看上去与补码类似,并不能说成是补码。

时间: 2024-10-12 19:56:03

使用加法器实现减法的相关文章

换一种思维理解计算机

是的,我们需要换一种思维去学习,这种思维就是——就是它为什么会出现,它的出现解决了什么问题 我们需要用加法器实现减法,怎么办呢,于是我们发明了补码(求反加一) 程序要处理未知数量的数据类型,怎么办呢,于是发明了指针进行动态内存分配

3、论二进制减法

根据上面的加法,我们觉得的确门逻辑能解决这种加法的进位问题.可是减法呢? 减法涉及到借位,并且还要判断位数能不能借,不能借得向更高的位去借,这种逻辑貌似门实现起来复杂度相当之高?其实不然 如何避免这种复杂的借位,最好的办法,向最高位的再高一位借一位,那么就涉及不到那么多位的借位了.也就是说8位,我们借第九位的一位.所以得到 253-176=77的情况下,我们可以借个1000,因为减1000只涉及到最高位的门逻辑,然后用999减去176,因为999和176都是三位,用相同数量的门电路可以实现了,结

Python实现二进制加法器

这两天看了<编码的奥秘>里面的二进制加法机及其后面的减法功能的实现,就用Python实现了一个类似功能的加法器出来. 先说一下整体的思想. 由于操作数都是二进制,所以计算简单了许多.首先,运算需要逐位操作,两个二进制数相加使用AndGate即可,但是重点在于要区分出来“和”和“进位”,分别使用XorGate和AndGate实现, 这就搞定了半加器.然后,需要考虑右一位的进位,所以需要一个CI(carry in),然后将本位的sum和右一位的carry in再放到一个半加器里面.再然后,要想明白

明德扬至简设计法设计的IP核加法器

一.功能描述 在Quartus II 和ISE中都有加法器的IP core,可以完成无符号数和有符号数的加.减法,支持有符号数的补码.原码操作及无符号数的加.减操作,引入了最佳流水线操作,可以方便的为用户生成有效的加法器,用户可以根据自己的需要来完成配置加法器 ,本案例用Altera和Xilinx的IP核实现了26位加法器的功能. 二.平台效果图 Altera仿真效果图 Xilinx仿真效果图 三.实现过程 Xilinx输入输出信号列表如下: 信号名 I/O 位宽 说明 clk I 1 系统工作

补码的减法

先来谈谈补码的非 补码的非 根据CASAPP,第59页,有如下公式 二进制的减法 减法运算其实是可以由加法运算替代的,我们上面已经介绍过了无符号和补码的非,其实很多CPU是没有减法运算器的,它们都是将减数进行逆运算以后送入加法器,然后进行加法运算,这样得出来的结果就是减法运算最终的结果. X + Y 就是 X+Y的加法逆元(非) 一种特殊情况 TMIN应该注意,他的加法逆元是他本身.这点在CASPP练习题2.32上有体现 我们来看一下原题 练习题2.32 你现在有个任务,编写函数tsub_ok的

如何用加法实现减法

注意观察发现:原码和反码再表示0的时候有两种表示,补码只有一种. 补码数表示的好处. 是可以统一整数的加减法. 包括 1)可以用加法计算减法. 2)正数和负数,可以使用同一个方式,计算加减法 3)用加法计算减法:那么只需要加法器的硬件实现,就可以同时计算加减法. 4)正数和负数,可以使用同一个方式,计算加减法:那么就不需要分别实现两套加法器了. 计算后,超出的位舍弃,然后看最高位符号位,如果在两数相加或者相减的时候符号位不同,则溢出了 一正一负相加不会产生溢出 两个同符号数相加,才可能产生溢出.

js中的一元加法和一元减法

大多数人都熟悉一元加法和一元减法,它们在 ECMAScript 中的用法与您高中数学中学到的用法相同. 一元加法本质上对数字无任何影响: 1 var iNum = 20; 2 iNum = +iNum; 3 alert(iNum); //输出 "20" 这段代码对数字 20 应用了一元加法,返回的还是 20. 尽管一元加法对数字无作用,但对字符串却有有趣的效果,会把字符串转换成数字. 1 var sNum = "20"; 2 alert(typeof sNum);

大数的减法除法

1.除法 1 //反着除 2 //c==0; 3 for(j=len;j>=1;j--) 4 { 5 s=a[j]+c*10; 6 a[j]=s/(i+1); 7 c=s%(i+1); 8 } 9 10 //排除前面的0 11 while(a[i][len]==0) 12 len--; 13 a[0]=len; 2.减法 跟除法的方式类似. 略.

高精度减法

高精度减法(a-b)(a>b且a,b均为正整数) .从键盘读入两个正整数,求它们的差. 分析:类似加法,可以用竖式求减法.在做减法运算时,需要注意的是:被减数必须比减数大,同时需要处理借位.高精度减法的参考程序: 1 program exam2; 2 const 3 max=200; 4 var 5 a,b,c:array[1..max] of 0..9; 6 n,n1,n2:string; 7 lena,lenb,lenc,i,x:integer; 8 begin 9 readln(n1);