我正在为它制作一个虚拟机和一个C编译器。我不明白的是大多数指令集有一个IMUL和IDIV,但不是一个ISUB和一个IADD。由于子通常是无符号的子我怎么能做一些像在x86Howcome程序集没有签名和未签名的子操作指令?
MOV EAX,1
MOV EDX,3
SUB EAX,EDX,EAX
并得到-2?
我正在为它制作一个虚拟机和一个C编译器。我不明白的是大多数指令集有一个IMUL和IDIV,但不是一个ISUB和一个IADD。由于子通常是无符号的子我怎么能做一些像在x86Howcome程序集没有签名和未签名的子操作指令?
MOV EAX,1
MOV EDX,3
SUB EAX,EDX,EAX
并得到-2?
带符号的加法总是会产生与无符号加法相同的位模式 - 只是对它们的解释不同 - 所以不需要为这两种情况分别指示。减法也是一样。
一般ADD和SUB指令设置两组条件标志,以便稍后可以检查使用ja/jb进行无符号比较或使用jg/jl进行符号比较的SUB比较结果。
(更准确地说:如果您已经有做无符号加法/减法模2说明^ wordlen,那么他们生产的将是每2的补正确的位模式签署加法/减法,其真正的结果是表示的数学这是因为无符号整数和2的补码有符号整数只是残基类模2 ^字长)的典范代表的不同选择。
当签名格式使用二进制补码表示时,即。 –
@StephenCanon:当然,但是你最后一次看到一个架构使用了不同于2的补码表示的有符号整数算术? –
每个指令只有一条指令,因为无论签名还是无符号的参数,减法和加法都会得到相同的结果。
你是否熟悉二的补码? – delnan
FWIW [MIPS](http://en.wikipedia.org/wiki/MIPS_architecture#Integer)确实同时具有无符号和有符号的加法和减法(不同之处在于它们是否检查是否溢出)。 – user786653
更加有趣的是,用2的补码,乘法结果的低半部分也与签名无关。这就是为什么没有只给出低部分的'mul'版本,'imul'已经这样做了。 – harold