我在自己学习汇编,我有一个困惑,我想要澄清。
因此,据我所知,x86计算机使用相同的电路进行加法和减法。对于减法,负数被转换为它的2补码,然后可以使用加法电路来执行减法。例如:方程式4 - 2被转换为4 + (-2)
那么,如果减法可以使用2补码来完成,那么SUB指令的目的是什么?
发布于 2015-03-22 19:03:07
在2的补码世界中,整数的求反可以通过取1的补码(所有位都反转)并加1来获得。例如,在8位世界中:
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)
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保持原样呢?
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或
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指令不是更容易吗?
SUB A, B如果你正在编写汇编语言来做大量的算术运算,你更喜欢哪种方法?并且,在第一种情况下,我使用了INC A指令。我可以在没有INC的情况下使用ADD A, 1。但是,在许多微处理器上,ADD A, 1需要我从指令内存中获取更多的指令来执行,以便获得立即的1值。因此,由于这样的操作是如此常见,所以提供了INC。
当微处理器设计者决定使用哪种指令集时,他们会考虑最常用的操作类型。减法很常见,所以使用SUB指令非常方便。因此,它几乎存在于你能找到的任何指令集中。指令集中还有其他指令,它们存在的原因就不那么明显了。例如,x86有XLAT指令,以及所有的“字符串”指令、LODS、STOS等。当我可以用MOV和INC等做所有这些工作时,为什么它们还存在?因为有人认为这些操作很常见,应该只有一条指令。
因此,SUB指令背后的目的,就像许多其他由CPU实现的指令一样,是为了提供一种更快(执行时间)和更简单的方法来执行通常在软件中执行的操作,同时平衡可以实现的指令数量的实际限制。
https://stackoverflow.com/questions/29193329
复制相似问题