【问题标题】:AAM instruction in 80868086 中的 AAM 指令
【发布时间】:2016-12-06 17:38:38
【问题描述】:

我是 8086 的新手,需要一点帮助。 我知道 AAM 的基础知识。 如果我多个两个编号假设 07H 和 09H

MUL AL,BL
AAM

这会将值 06H 存储在 AH 中,将 03H 存储在 AL 中。 但是假设如果以 3 个十六进制位的值应用 AAM,假设

MOV AL,77H
MOV BL,0AH
MUL BL
AAM

最后AL的内容是什么?

【问题讨论】:

  • 只需使用调试器并尝试一下。对于 77*0a 和 aam,我得到 ax = 01d06h,这不是有效的 BCD 结果。

标签: assembly masm x86-16


【解决方案1】:
AAM (BCD ADJUST AFTER MULTIPLY) 

from here

仅在两个 BCD 数字之间执行 mul 指令后使用 aam (未包装)。 mul 将结果存储在 AX 寄存器中。结果是 小于 100 所以它可以包含在 AL 寄存器中(低字节 AX 寄存器)。 aam 通过将 AL 除以 10 来解压缩 AL 结果, 将商(最高有效位)存储在 AH 中,并存储 AL 中的余数(最低有效位)。

那么问题是,如果我们提供的Al 的价值大于99,它会做什么?

它会执行相同的 AH = AL / 10AL = AL mod 10,但会留下不正确的未打包 bcd 值。

所以来看看你的情况 在 AAM AL 之前将是 166 (0xA6)AX 在相乘之后将是 0x04A6) 在AAM之后

  Ah=  166/10=16 ( 0x10)
  AL=166 mod 10=6 (0x6)

正如我们所见,AXAAM 之后将是0x1006 它留下了不正确的unpacked bcd number。因为输入不低于100

【讨论】:

  • 是ascii调整还是bcd调整?都一样吗?
  • 是的,它可以互换使用。但可能“ASCII 调整”更符合字母。但是,您仍然需要或使用 48(十六进制:30)来获取 ASCII 数字
【解决方案2】:

ASCII 乘法后调整 (AAM)

修正两个 BCD 相乘的结果 价值观。

算法

AH = AL / 10

AL = 余数

示例

移动 AL, 15 ; // AL = 0Fh

AAM ; // AH = 01, AL = 05

返回

【讨论】:

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