首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SUB指令的目的是什么?

SUB指令的目的是什么?
EN

Stack Overflow用户
提问于 2015-03-22 18:36:38
回答 1查看 16.4K关注 0票数 11

我在自己学习汇编,我有一个困惑,我想要澄清。

因此,据我所知,x86计算机使用相同的电路进行加法和减法。对于减法,负数被转换为它的2补码,然后可以使用加法电路来执行减法。例如:方程式4 - 2被转换为4 + (-2)

那么,如果减法可以使用2补码来完成,那么SUB指令的目的是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-22 19:03:07

在2的补码世界中,整数的求反可以通过取1的补码(所有位都反转)并加1来获得。例如,在8位世界中:

代码语言:javascript
复制
A:   0x00000002    ; my number
~A:  0xFFFFFFFD    ; 1's complement of my number
-A:  0xFFFFFFFE    ; 2's complement of my number (negative A)

为了减去A-B,我们当然可以加上负数,A+(-B)

代码语言:javascript
复制
NOT  B              ; invert each bit in the 8-bit value, B
ADD  B, 1           ; add 1, giving the 2's complement negated B
ADD  A, B

当然,在添加B之前,我必须修改它(否定它)。如果我想让B保持原样呢?

代码语言:javascript
复制
PUSH B              ; save B
NOT  B              ; invert each bit in the 8-bit value, B
INC  A              ; add 1, giving the 2's complement negated B
ADD  A, B
POP  B              ; restore B

代码语言:javascript
复制
NOT  B              ; invert each bit in the 8-bit value, B
INC  A              ; add 1, giving the 2's complement negated B
ADD  A, B
NOT  B              ; restore B

所以这是可行的。但是,只有一条SUB指令不是更容易吗?

代码语言:javascript
复制
SUB  A, B

如果你正在编写汇编语言来做大量的算术运算,你更喜欢哪种方法?并且,在第一种情况下,我使用了INC A指令。我可以在没有INC的情况下使用ADD A, 1。但是,在许多微处理器上,ADD A, 1需要我从指令内存中获取更多的指令来执行,以便获得立即的1值。因此,由于这样的操作是如此常见,所以提供了INC

当微处理器设计者决定使用哪种指令集时,他们会考虑最常用的操作类型。减法很常见,所以使用SUB指令非常方便。因此,它几乎存在于你能找到的任何指令集中。指令集中还有其他指令,它们存在的原因就不那么明显了。例如,x86有XLAT指令,以及所有的“字符串”指令、LODSSTOS等。当我可以用MOVINC等做所有这些工作时,为什么它们还存在?因为有人认为这些操作很常见,应该只有一条指令。

因此,SUB指令背后的目的,就像许多其他由CPU实现的指令一样,是为了提供一种更快(执行时间)和更简单的方法来执行通常在软件中执行的操作,同时平衡可以实现的指令数量的实际限制。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29193329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档