如何在x86汇编中移动两个浮点数的结果
How do I move the result of a mul of two floats in x86 assembly?
我目前正在尝试将两个浮点数相乘,一个来自浮点向量(地址存储在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的一部分很长时间了)。
相关文章:
- 为什么将两个浮点数相加会得到一个整数C++?
- 是否可以在 for 循环中添加两个浮点数?
- AVX2:计算 512 个浮点数组的点积
- 编写程序,导入三个浮点数a,b和c.按升序排序
- 在不使用 * 和 / 运算符的情况下将两个浮点数相乘和除以
- 如何线性化两个浮点变量的乘积
- 比较 C++ 中的两个浮点变量
- 有没有更有效的方法可以原子地添加两个浮点数?
- 使用 cin 错误输入多个浮点数
- 添加 2 个浮点数时保持精度
- 如何将 4 个浮点数的 ps 向量转换为 4 个双精度并存储到 pd 数组
- 划分两个浮点数不会给出确切的结果
- 如何找到两个浮点数之间的最短十进制数
- 如何设计一种算法,将两个浮点数相乘而不带"*"?
- 用c++把两个浮点数相乘得到的结果是非数字的
- 在c++中计算两个浮点数之差时,y * (1 - x / y)是否优于y - x ?
- c++将两个浮点数相除得到int
- 如何使用sse将两个浮点数组相乘
- 如何在x86汇编中移动两个浮点数的结果
- 两个浮点数相加时的意外输出