Bru*_*lon 1 c++ floating-point x86 assembly multiplication
我目前正在尝试将两个浮点数相乘,一个来自浮点向量(存储在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
Run Code Online (Sandbox Code Playgroud)
我知道如果我使用x87命令或SSE指令,这将是更容易的数量级,但问题的约束需要纯x86汇编代码.对不起,如果这看起来有点基础,但我仍然在学习装配的特质.
提前感谢您的帮助,祝您度过愉快的一天
您将浮点数的表示形式乘以整数,而不是浮点数本身:
1.0 = 0x3f800000
32.0 = 0x42000000
0x3f800000 * 0x42000000 = 0x105f000000000000
Run Code Online (Sandbox Code Playgroud)
要实际执行浮点运算,您需要执行以下操作之一:
显然,前两个选项要简单得多,但听起来它们不是出于某种原因而选择它们(虽然我无法想象为什么不这样做; x87和SSE 是 "纯x86汇编代码",因为它们'很长一段时间以来一直是ISA的一部分).