1

我正在为它制作一个虚拟机和一个 C 编译器。我不明白的是大多数指令集如何具有 IMUL 和 IDIV,但没有 ISUB 和 IADD。由于 sub 通常是 unsigned sub 我怎么能在 x86 中做类似的事情

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

并得到-2?

4

2 回答 2

5

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

于 2012-10-29T18:52:35.747 回答
5

有符号加法总是产生与无符号加法相同的输出位模式——只是它们的解释不同——因此不需要为这两种情况提供单独的指令。减法也是一样。

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

(更准确地说:如果您已经有执行无符号加法/减法模 2^wordlen 的指令,那么它们产生的位模式对于每个 2 的补码有符号加法/减法都是正确的,其真实结果是可表示的。从数学上讲,这是因为无符号整数和2 的补码有符号整数只是残差类模 2^wordlength 的典型代表的不同选择)。

于 2012-10-29T18:54:58.360 回答