【发布时间】:2015-08-31 17:21:05
【问题描述】:
我正在尝试在不使用 FP 硬件指令的情况下实现浮点乘法。
我认为我的代码适用于符号位和指数位,但不适用于尾数。
总体思路:
1. 添加这两个数字的指数。
2. 将它们的尾数相乘。
3. 归一化尾数。
4. 将归一化尾数得到的部分加到指数上。
我暂时忽略符号位,因为我在高于 0 的值上对其进行测试。
这就是问题所在:我尝试将这两个尾数相乘,然后 - 因为结果将在两个寄存器 edx:eax 中 - 将位从 edx 一位一位移动到 eax 同时增加指数。 但这似乎不起作用,所以我想知道我的想法是否好,或者也许有更好的方法来做到这一点?
这是我已经在 MASM 中写的内容:
mov eax, [ebp+8] ;put into eax one of numbers to multiply
mov ecx, a ;in ecx is second number to multiply, constant = 1.8
and ecx, 7F800000H ;mask to get exponent
and eax, 7F800000H
shr ecx, 23
shr eax, 23
sub ecx, 127
sub eax, 127
add ecx, eax ;exponent of the final number - later should be added part got from mantissa
mov eax, [ebp+8]
mov edx, a
and eax, 007FFFFFH ;getting mantissa
and edx, 007FFFFFH
; editor's note: unsure if there were any unlisted instructions
; between the two code in the original
mul edx ; multiply the mantissas
mov ebx, 0
spr:
cmp edx, 0 ;check if edx is cleared out
jne przesun
je dalej
przesun:
inc ecx
shr eax, 1 ;making space for new bit
shr edx, 1 ;put bit to CF
bts eax, 31 ;putting bit from CF ; Bug #1, see Michael's answer
jmp spr
dalej:
shr eax, 7
shl ecx, 23
add eax, ecx ;result of multiplying
我尝试乘以 1.8 的每个数字的结果都是 0。
(atm 我在 15 号上测试,所以结果应该是 27)
【问题讨论】:
-
"从 edx 到 eax 逐位移位,同时增加指数"。我没有在您发布的代码中看到这一点。您应该发布包含您所询问问题的代码。 “但它似乎不起作用”。定义“它不起作用”。会发生什么?
-
感谢您的回复。我添加了缺少的代码。会发生什么 - 结果不正确。
-
@Kate:既然你要求人们调试你的代码,除非你希望人们自己组装它并在他们自己的调试器中单步执行它,你应该列出你想要的值以及您实际获得的价值。 “结果不正确”比“不起作用”添加了几乎为零的新信息。
-
我更多的是询问我的总体想法是否正确,因为我相信如果我从一开始就错了,就没有调试的意义。我想要的值是 27,乘以 15*1.8 的结果。我得到的值,我已经写的是 0。我想乘以 1.8 的每个数字都是 0。
-
@Kate:您应该将其编辑到顶部附近的问题中。还要用文字描述你的算法是什么。阅读可能存在错误的汇编代码并不是人们理解您当前算法的简单方法。正确使用算法并在 asm 中实现它实际上是两件完全不同的事情。例如,您可以用 C 编写正确的实现。然后您可以将编译器输出与您的手写 asm 进行比较。
标签: assembly x86 masm multiplication floating-point-precision