我目前正在尝试将两个浮点数相乘,其中一个来自浮点向量(存储在 ebx 中的地址),并与我存储在 ecx 中的值相乘。
我已经确认输入值是正确的,但是,例如,如果我将 32 乘以 1,则 EAX 中的值将更改为 00000000,而 EDX 中的值将更改为 105F0000。根据我对 MUL 的理解,发生这种情况是因为它将结果的高位存储在 EDX 中,将低位存储在 EDX 中。问题是,如何将结果移动到输出变量(returnValue)中?这是有问题的代码片段:
AddColumnsIteration:
cmp esi, 4 // If we finished storing the data
jge NextColumn // Move to the next column
mov eax, [ebx][esi * SIZEOF_INT] // Get the current column
mul ecx // Multiply it by tx
add [returnValue][esi * SIZEOF_INT], eax // Add the data pointed at by eax to the running total
inc esi // Element x, y, z, or w of a Vec4
jmp AddColumnsIteration // Go back to check our loop condition
我知道如果我使用 x87 命令或 SSE 指令,这会容易几个数量级,但问题的限制需要纯 x86 汇编代码。抱歉,如果这看起来有点基础,但我仍在学习汇编的特性。
预先感谢您的帮助,祝您有愉快的一天
您将浮点数的表示形式相乘为整数,而不是浮点数本身:
1.0 = 0x3f800000
32.0 = 0x42000000
0x3f800000 * 0x42000000 = 0x105f000000000000
要实际进行浮点运算,您需要执行以下操作之一:
- Use x87.
- Use SSE.
- 编写您自己的软件乘法,将编码分为符号位、指数和有效数,对符号位进行异或以获得乘积的符号位,添加指数并调整偏差以获得乘积的指数,将有效数相乘并舍入获取乘积的有效数,然后将它们组合起来产生结果。
显然,前两个选项要简单得多,但听起来由于某种原因它们不是一个选项(尽管我真的无法想象为什么不可以;x87 和 SSEare“纯 x86 汇编代码”,因为它们长期以来一直是 ISA 的一部分)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)