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

How do I move the result of a mul of two floats in x86 assembly?

本文关键字:两个 浮点数 结果 x86 汇编 移动      更新时间:2023-10-16

我目前正在尝试将两个浮点数相乘,一个来自浮点向量(地址存储在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

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

  • 使用x87。
  • 使用SSE。
  • 编写自己的乘法软件,将编码分离为符号位、指数和有效位数,对符号位进行x运算得到乘积的符号位,对指数进行相加并调整偏置得到乘积的指数,对有效位数进行相乘并四舍五入得到乘积的有效位数,然后将它们组合成结果。

显然,前两个选项要简单得多,但听起来它们出于某种原因不是一个选项(尽管我真的无法想象为什么不是;x87和SSE "纯x86汇编代码",因为它们已经成为ISA的一部分很长时间了)。