1.前言
关于这个问题是因为在学习8086系统的SUB指令和MCS-51的SUBB指令中都有提到计算机在执行减法时都是用求补之后进行加法运算的方法执行的,由于本人并不了解计算机到底时怎么执行的,从网上查了很多相关文章之后,只能根据自己的推断进行一些总结,望大佬或相关从业者能指出其中的错误,感谢🙇。
2.问题的由来
总所周知,求补运算是用来方便有符号数的运算的,但是当学习到SUBB指令时,我有了很多的疑惑。第一,计算机是否知道要进行的操作数时有符号还是无符号?第二,计算机进行减法时进行求补运算,如何辨别有无符号?第三,计算机在进行无符号相减时,是怎么求补码的?
3.计算机对操作数的识别
很显然,计算机底层不过是一个个逻辑门,没有那么智能辨别有无符号,在汇编语言中,正数的补码等于原码,比如
MOV A,#06H
那负数的补码就是除符号位取反+1,比如-14=10001110B(原)=11110010B(补),对于汇编,可以编写为
MOV A,#-14
或者
MOV A,#F2H;注意负数写进内存中是以补码的形式存入的,因为正数补码不变,所以也相当于补码存入的。
对于计算机,存入的06H和F2H就是00000110和11110010,不会考虑06H有没有符号,也不会考虑F2H(-14)到底是242还是-14,因为对于计算机的加法器来说,减去14和加上242没什么区别。
所以对于加法器来说,都是01相加而已,加法器不懂什么有无符号,但是在人类角度看来,加法器可以称为只进行无符号运算,也就是符号位也参与加法运算。
4.执行SUB指令或者SUBB指令时计算机内部的工作原理
SUB指令时8086系统的减法指令,SUBB是51系统的减法指令,两者大体一样,都是加上减数Y的相反数-Y的补码(这样说其实不准确,后面会说到)来进行运算,比如
MOV A,#06H
SUBB A,#03H
作用就是6-3,计算机会看做6+(-3)即00000110(补)+11111101(补),-3为1000001