这个内联汇编对于将 int 位转换为 float 正确吗?

问题描述 投票:0回答:1

我正在尝试熟悉 gnu 内联汇编。我编写了一行内联汇编将 int 重新解释为 float。虽然这打印了正确的结果,但我想知道这是否正确。

#include <stdio.h> 

int main() {
    int x = 0x80000000; // -0.0
    float y;
    asm("vmovd %0, %%xmm0"
     : "=r"(y)
     : "r"(x));
    printf("%f\n", y); 
}

我是组装初学者。

c assembly gcc x86 inline-assembly
1个回答
0
投票

由于以下几个原因,这是不正确的:

  • 您假设
    y
    位于
    xmm0
    中,但这不一定是真的。
  • 您使用
    %0
    而不是
    %1
    作为输入。
  • 您对
    r
    使用了
    y
    约束,但
    r
    用于通用寄存器,而
    x
    应用于
    xmm
    寄存器。

更正后的代码是:

asm("vmovd %1, %0"
 : "=x"(y)
 : "r"(x));

请注意,这假设您使用的是 x86-64,并且

vmovd
需要 AVX 支持(否则使用
movd
)。

© www.soinside.com 2019 - 2024. All rights reserved.