2012-10-29 28 views
1

我正在为它制作一个虚拟机和一个C编译器。我不明白的是大多数指令集有一个IMUL和IDIV,但不是一个ISUB和一个IADD。由于子通常是无符号的子我怎么能做一些像在x86Howcome程序集没有签名和未签名的子操作指令?

MOV EAX,1 
MOV EDX,3 
SUB EAX,EDX,EAX 

并得到-2?

+5

你是否熟悉二的补码? – delnan

+0

FWIW [MIPS](http://en.wikipedia.org/wiki/MIPS_architecture#Integer)确实同时具有无符号和有符号的加法和减法(不同之处在于它们是否检查是否溢出)。 – user786653

+0

更加有趣的是,用2的补码,乘法结果的低半部分也与签名无关。这就是为什么没有只给出低部分的'mul'版本,'imul'已经这样做了。 – harold

回答

5

带符号的加法总是会产生与无符号加法相同的位模式 - 只是对它们的解释不同 - 所以不需要为这两种情况分别指示。减法也是一样。

一般ADD和SUB指令设置两组条件标志,以便稍后可以检查使用ja/jb进行无符号比较或使用jg/jl进行符号比较的SUB比较结果。

(更准确地说:如果您已经有做无符号加法/减法模2说明^ wordlen,那么他们生产的将是每2的补正确的位模式签署加法/减法,其真正的结果是表示的数学这是因为无符号整数和2的补码有符号整数只是残基类模2 ^字长)的典范代表的不同选择。

+0

当签名格式使用二进制补码表示时,即。 –

+1

@StephenCanon:当然,但是你最后一次看到一个架构使用了不同于2的补码表示的有符号整数算术? –

5

每个指令只有一条指令,因为无论签名还是无符号的参数,减法和加法都会得到相同的结果。