【问题标题】:MUL instruction in 80868086 中的 MUL 指令
【发布时间】:2015-12-24 17:21:55
【问题描述】:

** 问题的长版本:当我查看 8086 指令集的手册,特别是 MUL 指令时,我看到操作数可以在寄存器中(8 位或 16 位)或可以在内存中(也可以是 8 位或 16 位)。如果操作数是 16 位,8086 使用 AX 作为累加器,如果操作数是 8 位,则使用 AL(8 位).. 如果操作数在内存中,它如何知道操作数的大小??

** 问题的简短版本:8086如何知道以下指令中的操作数是16位还是8位:MUL [1234H]

【问题讨论】:

  • 与8086无关,不必猜测。你的 assembler 如何知道要生成什么样的 MUL 指令。我们不知道您使用的是什么汇编程序。
  • 这取决于你使用的汇编器。

标签: assembly x86-16


【解决方案1】:

您可以通过以下方式指定它:

mul word [epb]
mul byte [epb]

【讨论】:

  • 更正确的是word ptrbyte ptr,而不是简单的wordbyte
  • @Netch:这取决于您的汇编程序。 NASM 和 YASM 实际上拒绝 ptr(YASM:undefined symbol `ptr' (first use))。你必须只使用wordbytenot byte ptr
  • @PeterCordes 很好,我已经在gasintel_syntax 上进行了测试。这种差异非常可悲。
  • @Netch:在 NASM/YASM 中,mov reg, symbolmov reg, imm32 (MASM mov reg, OFFSET symbol)。在 MASM 中,这是一个负载(与 mov reg, [symbol] 相同)。所以在某些方面这是一件好事,还有一些语法差异会导致汇编时错误。不过,GNU 汇编器接受 bytebyte ptr 以获得更多兼容性,我并不感到惊讶。
【解决方案2】:

相同的汇编语言助记符将产生几个不同的操作码之一,具体取决于操作数。几乎所有指令都有多种编码。 16 位与 32 位与 64 位由前缀字节(和当前模式)决定,但 8 位始终是单独的操作码。请参阅 wiki 上的链接以获取文档,包括 Intel 指令集参考指南,其中显示了每个助记符的所有各种编码。

我猜当从 286 升级到 386 时,英特尔意识到为所有内容添加另一个操作码是不可行的,因为缺少操作码空间。

mov 具有特别令人印象深刻的多种形式,但所有整数 ALU 运算,如 addand 等,种类繁多。


MUL [1234H] 不明确。像 NASM 或 YASM 这样的优秀汇编程序会将其称为错误,而不是猜测。 MASM 会跟踪符号声明,因为它认为汇编语言应该有“变量”,所以 MASM 中的 mul [byte_var] 可能会汇编为 mul m8 形式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多