FFH TH-6ren">
gpt4 book ai didi

assembly - i386 指令 "div ah"毫无意义吗?

转载 作者:行者123 更新时间:2023-12-03 17:04:14 28 4
gpt4 key购买 nike

来自 https://www.felixcloutier.com/x86/div :

    ...
temp ← AX / SRC;
IF temp > FFH
THEN #DE; (* Divide error *)
ELSE
AL ← temp;
AH ← AX MOD SRC;
FI;
...
对于 div ah SRC将是 ah .恕我直言 temp将始终大于 FFH因此将引发异常,因为:
  • AX = 256*AH+AL
  • 温度 = AX/AH = (256*AH+AL)/AH = 256 + AL/AH
  • 温度超过 FFH

  • 我在这里想念什么吗?

    最佳答案

    没错,就像div edx如果没有故障,它永远无法使用。 2N/N => N 位的标准 div不溢出其商是 high_half(dividend) < divisor ,正如你所展示的,所以使用 divisor = high(dividend)将始终溢出(或除以零)。 Why "DIV EDX" in MASM always generates processor exception?用另一种方式解释同样的事情。
    有趣的一点是,这是一种有保证的单指令方式来引发 #DE但是,不需要任何指令将值放入寄存器。
    (在保护模式下,int 0 并不完全相同。例如,在 Linux 下,在用户空间 int 0#GP -> SIGSEGV,因为对 IDT 条目的权限,而实际的除法异常将 #DE -> SIGFPE)。

    正如 Jester 指出的那样,该编码仅占 F6 /6 div r/m8 的 2^5 种可能编码中的一种。 ,只计算 ModRM 字节(不是寻址模式可以使用的额外字节的巨大可能性)。
    使其不可编码将需要在解码器中使用额外的晶体管。然后你如何处理这个 2 字节的序列? #UD非法指令异常?太傻了,就让它养#DE在正常解码并像其他任何地方一样进入执行单元后 div操作说明。或者将它用于其他一些特殊的事情,例如 mfence ?
    拥有 div ah 的 2 字节机器码可能并不是真正明智的设计决定。实际上意味着一些完全不同的单一指令。无论如何,那艘船以 8086 航行,它将在那里升起 #DE ,不是 #UD ;任何更改都会破坏向后兼容。由于为新操作码寻找新编码空间的方法较少(例如 the illegal encodings of lds and les or whatever that VEX prefixes borrow ),因此英特尔和 AMD 还没有陷入这种疯狂。那些 LES/LDS 32 位模式编码已经提出 #ud而不是另一个异常(exception),更重要的是有更多的空闲位,因此 VEX 前缀有空间实际编码那些 2 或 3 字节前缀中的某些字段。

    关于assembly - i386 指令 "div ah"毫无意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63273843/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com