如何在x86汇编中将整数转换为浮点数值?

3

我需要将一个整数(二进制补码)乘以一个浮点常数。这是我的代码:

.data
pi  dd 3.14
int dd 0ah


.code
fld pi

???

fmul ST(1), ST

如何将int转换为浮点数,以便与pi相乘?


2
你可能想要使用fldpi指令。 - Jens Björnhager
这不是显而易见的吗?你可以“免费”获得π。 - Jens Björnhager
2个回答

13

太好了!这些指令是在x86指令集中添加的时间是什么时候?(就像386/7,486/7一样...?) - Nathan Osman
1
@NathanOsman:它们中的大多数是使用8087添加的。sin/cos/tan指令是在387中引入的,可能还有其他超越函数(exp / log指令)。如果x87可用,则可以使用fimul dword [int];无需使用单独的fild。https://www.felixcloutier.com/x86/fmul:fmulp:fimul - Peter Cordes

0

现在使用x86 FPU已经非常过时,而且比SSE/AVX等方式慢得多。

最好至少使用SSE和cvtdq2psdoc

例如:

.data
int dd 0ah
pi  dd 3.14

.code
movss xmm0, [data] ; load 32bit data into xmm0
cvtdq2ps xmm0, xmm0 ; convert 4 float values to integers, we use only lowest float/integer
mulss xmm0, [pi]

对于汇编语言开发,链接汇编文档而非内嵌函数指南更有意义。https://www.felixcloutier.com/x86/cvtdq2ps 。另外,顺带一提,是的 movss(或 movd)+cvtdq2ps 实际上与更明显的 cvtsi2ss xmm0,dword [int] 相等或更好。 这需要更多的微操作单元才能与旧值合并(因为英特尔的设计不良/短视而没有将 xmm 目标的其余部分清零),因此具有错误依赖性,除非您花费额外的微操作单元来先执行 xor-zero xmm0 操作。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接