【问题标题】:Howcome assembly does not have an signed and unsigned subraction instruction?为什么汇编没有有符号和无符号减法指令?
【发布时间】:2012-10-19 03:11:35
【问题描述】:

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

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

得到-2?

【问题讨论】:

  • 你熟悉二进制补码吗?
  • FWIW MIPS 确实有无符号和有符号的加减法(它们是否检查溢出不同)。
  • 更有趣的是,使用 2 的补码,乘法结果的低半部分也与符号无关。这就是为什么没有任何版本的 mul 只给出较低的部分,imul 已经做到了。

标签: assembly signed unsigned-integer


【解决方案1】:

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

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

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

【讨论】:

  • 当有符号格式使用二进制补码表示时,即。
  • @StephenCanon:当然,但是您最后一次看到使用不同于 2 的补码表示有符号整数算术的架构是什么时候?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 2012-12-13
    • 2021-07-30
    • 2013-10-28
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多