我正在尝试熟悉 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);
}
我是组装初学者。
由于以下几个原因,这是不正确的:
y
位于 xmm0
中,但这不一定是真的。%0
而不是 %1
作为输入。r
使用了 y
约束,但 r
用于通用寄存器,而 x
应用于 xmm
寄存器。更正后的代码是:
asm("vmovd %1, %0"
: "=x"(y)
: "r"(x));
请注意,这假设您使用的是 x86-64,并且
vmovd
需要 AVX 支持(否则使用 movd
)。