【问题标题】:How would the MUL operation on AX with Pi (3,1415..) in (8.8) format work in Assembly?(8.8) 格式的 AX 上的 MUL 操作如何在汇编中工作?
【发布时间】:2020-11-23 15:54:07
【问题描述】:

我是汇编新手,正在学习定点算术。

AX 是一个 16 位寄存器-

 MUL Pi  ; Multiplies EAX with Pi and stores result in EAX
 DIV 256 ; Divides EAX by 256 which equals the necessary right- shift for the 8,8 format

但我不认为它是这样工作的。

【问题讨论】:

  • 将两个 16 位值相乘得到一个 32 位值,然后对于 8,8,您必须将 32 位值除以 256 并将其填充回 16 位寄存器(大概),这与取中间 2 个字节相同(您不必实际进行除法!)

标签: assembly x86 fixed-point


【解决方案1】:

具有字大小操作数的MUL 指令将AX 与该操作数相乘,并将其结果放入DX:AX。如果两个操作数都是 8.8 格式,则结果将是 16.16 格式,整数部分为 DX,小数部分为 AX。要将其转换为 8.8 格式,您可以像这样获取 DLAH 的内容:

MUL Pi        ; multiple by Pi, leaving the integral part in DX and the fraction in AX
MOV AL, AH    ; move the fractional part into place
MOV AH, DL    ; move the integral part into place

而且一切都会正常进行。请注意,四舍五入可能会有所偏差。你可以这样纠正:

MUL Pi        ; multiple by Pi, leaving the integral part in DX and the fraction in AX
ADD AX, 0080h ; apply rounding to AH
ADC DX, 0     ; apply carry if any
MOV AL, AH    ; move the fractional part into place
MOV AH, DL    ; move the integral part into place

这会根据原理正确地对结果进行四舍五入

round(x) = ⌊x + 0.5⌋

【讨论】:

  • 谢谢!当两个 16 位寄存器或寄存器/值相乘时,结果存储在 EAX 寄存器中。所以atm。我不明白为什么整数部分在 DX 中,而分数在 AX 中。还有:为什么在 AX 中使用 AH,在 DX 中使用 DL。
  • @user14585966 你是在做单字乘法还是双字乘法? Pi 是如何定义的?
  • 它以 16 位 so word 表示
  • @user14585966:不,mul word [Pi] 执行 DX:AX = AX * [Pi],而不是 EAX,即使机器支持 32 位。阅读手册felixcloutier.com/x86/mul。如果您可以假设 386(对于像 EAX 这样的寄存器),您还可以使用像 shrd AX, DX, 8 这样的指令将 32 位乘积右移 8 位,将中间的 16 位留在 AX 中。或者您可以对输入进行零或符号扩展并使用 32 位 imul
猜你喜欢
  • 2013-02-12
  • 1970-01-01
  • 2018-07-25
  • 2017-04-15
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2012-06-04
相关资源
最近更新 更多