【问题标题】:How to use IMUL and MUL instruction in emu8086?如何在emu8086中使用IMUL和MUL指令?
【发布时间】:2016-06-10 06:25:14
【问题描述】:

如何在emu8086中使用IMULMUL? .. 不允许在 emu8086 中使用 movzx

例如 movzx 在 emu8086 中是不允许的,这种替代方案将 请允许我使用指令,emu8086 是否有类似的东西 替代,所以我使用指令 IMUL / MUL?

1  movzx bx,centerBot ;not allowed in emu8086
2
3  mov bh,00          ;alternative of line 1 
4  mov bl,centerBot   ;to move centerBot to bx
                      ;in emu8086

emu8086 中的IMUL/MUL 有类似的东西,所以我可以提供这些说明吗?

【问题讨论】:

  • 您的代码中没有 MUL 或 IMUL,您询问的是完全不同的指令。你到底想做什么?
  • 您不需要替代imulmul;单操作数形式是 8086 的一部分,后来没有添加。 (有关显示何时添加每条指令的每种形式的链接,请参阅the x86 tag wiki)。要乘以小的汇编时常数,通常值得使用移位和加法或减法而不是乘法......或者至少如果shl r, imm8 可用的话。当然,现代 Intel CPU 的乘法速度非常快(imul r64, r64, imm32 有 3 个周期延迟。)
  • @peter 标记 wiki 中的哪个链接显示了添加每条指令的每种形式的时间?我浏览了一下,但找不到这样的链接。
  • @CodyGray: posix.nl/linuxassembly/nasmdochtml/nasmdoca.html,NASM 手册的旧版本,在他们删除每条指令的解释之前。 (这很有趣,因为它包含仅 Cyrix 的 MMX 指令,以及未记录的 Intel 和其他 insn)。它位于标签 wiki 中英特尔手册和 Felix Cloutier 的 HTML 版本链接下方。抱歉故意含糊/懒惰:P

标签: assembly tasm emu8086


【解决方案1】:

正如您通过查看 x86 指令集指南(herehere)所看到的,自 8086 以来就支持 mulimul 指令。因此,如果 Emu8086 实际模拟Intel 8086,那么它也应该模拟这两个指令。使用它们应该没有问题。

MUL 用于无符号乘法,在 8086 上有两种形式:16 位版本和 8 位版本:

  • MUL r16|m16   ⇔   dx:ax = ax * r16|m16

  • MUL r8|m8   ⇔   ax = al * r8|m8

IMUL 有相同的两个版本,但将值视为有符号。


关于movzx 的解决方法/模拟,最好使用:

xor bx, bx          ; clear BX (upper and lower bits)
mov bl, centerBot   ; copy centerBot to the lower bits of BX

或者您可以将centerBot 设置为字大小的变量/内存,这样可以直接移动:

mov bx, centerBot

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多