Assembly 为什么程序集没有带符号和不带符号的分段指令?

Assembly 为什么程序集没有带符号和不带符号的分段指令?,assembly,signed,unsigned-integer,Assembly,Signed,Unsigned Integer,我正在为它制作一个虚拟机和一个C编译器。我不明白的是,大多数指令集都有IMUL和IDIV,但没有ISUB和IADD。既然sub通常是未签名的sub,我怎么能在x86中执行类似的操作呢 MOV EAX,1 MOV EDX,3 SUB EAX,EDX,EAX 并且得到-2?每一条指令只有一条,因为无论参数是有符号的还是无符号的,减法和加法都会产生相同的结果。每一条指令只有一条,因为无论参数是有符号的还是无符号的,减法和加法都会产生相同的结果。有符号加法总是产生与无符号加法输出相同的位模式——只是对

我正在为它制作一个虚拟机和一个C编译器。我不明白的是,大多数指令集都有IMUL和IDIV,但没有ISUB和IADD。既然sub通常是未签名的sub,我怎么能在x86中执行类似的操作呢

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

并且得到-2?

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

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

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

常规ADD和SUB指令设置了两组条件标志,以便以后可以使用ja/jb检查基于子的比较的结果(对于无符号比较),或使用jg/jl检查基于子的比较的结果(对于有符号比较)


(更准确地说:如果您已经有了以2^wordlen模进行无符号加减运算的指令,那么它们产生的位模式对于每个2的补码有符号加减运算都是正确的,其真实结果是可表示的。从数学上讲,这是因为无符号整数和2的补码有符号整数完全不同有符号加法总是产生与无符号加法输出相同的位模式——只是它们的解释不同——因此这两种情况不需要单独的指令。减法也是一样的

常规ADD和SUB指令设置了两组条件标志,以便以后可以使用ja/jb检查基于子的比较的结果(对于无符号比较),或使用jg/jl检查基于子的比较的结果(对于有符号比较)


(更准确地说:如果您已经有了以2^wordlen模进行无符号加减运算的指令,那么它们产生的位模式对于每个2的补码有符号加减运算都是正确的,其真实结果是可表示的。从数学上讲,这是因为无符号整数和2的补码有符号整数完全不同剩余类的标准代表的选择(模2^字长)。

你熟悉二的补码吗?FWIW既有无符号的,也有符号的加减法(不同于它们是否检查溢出)更有趣的是,对于2的补码,乘法结果的下半部分也与符号无关。这就是为什么没有只给出下半部分的
mul
版本,
imul
已经这样做了。你熟悉2的补码吗?FWIW既有无符号的,也有符号的加法和减法n(不同于是否检查溢出)更有趣的是,对于2的补码,乘法结果的下半部分也与符号无关。这就是为什么没有只给出下半部分的
mul
版本,
imul
已经这样做了。当符号格式使用两个补码表示时,也就是说。@StephenCanon:当然,但什么时候做的您上次看到的体系结构在有符号整数运算中使用了不同于2的补码表示法?当有符号格式使用了2的补码表示法时,也就是说。@Stephennon:当然,但您上次看到的体系结构在有符号整数运算中使用了不同于2的补码表示法是什么时候?