如何在x86汇编中移动两个浮点数的结果?

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汇编代码.对不起,如果这看起来有点基础,但我仍然在学习装配的特质.

提前感谢您的帮助,祝您度过愉快的一天

Ste*_*non 6

您将浮点数的表示形式乘以整数,而不是浮点数本身:

 1.0 = 0x3f800000
32.0 = 0x42000000

       0x3f800000 * 0x42000000 = 0x105f000000000000
Run Code Online (Sandbox Code Playgroud)

要实际执行浮点运算,您需要执行以下操作之一:

  • 使用x87.
  • 使用SSE.
  • 编写自己的软件乘法,将编码分为符号,指数和有效数,x符号位以获得乘积的符号位,加上指数并调整偏差以得到乘积的指数,乘以有效数和有效数获得产品的有效数字,然后组装它们以产生结果.

显然,前两个选项要简单得多,但听起来它们不是出于某种原因而选择它们(虽然我无法想象为什么不这样做; x87和SSE "纯x86汇编代码",因为它们'很长一段时间以来一直是ISA的一部分).