内联 asm:将 imm 移动到没有符号扩展的 64 位寄存器
Inline asm: move imm to a 64-bit register without sign-extension
我想使用内联汇编将 64 位无符号整数移动到寄存器。如果常量实际上适合 32 位,则会发生符号扩展。
这是我的代码:
#include "stdint.h"
uint64_t foo() {
uint64_t x;
asm ("movq %1, %0"
: "=q" (x)
: "i" (0x00000000faceffff) );
return x;
}
现在,clang -S code.c
生成以下程序集:
#APP
movq $-87097345, %rax # imm = 0xFFFFFFFFFACEFFFF
#NO_APP
gcc 也是如此。 movabsq
代替 movq
也是一样。与 "p"
约束相同,而不是 "i"
。
如果常量大于 32 位,我会得到我期望的结果。
是否有常量的后缀以在 gcc 中将它们声明为 unsigned long long?对于 Microsoft 编译器,在本例中为“...ull” 0x00000000faceffffull。
我想使用内联汇编将 64 位无符号整数移动到寄存器。如果常量实际上适合 32 位,则会发生符号扩展。
这是我的代码:
#include "stdint.h"
uint64_t foo() {
uint64_t x;
asm ("movq %1, %0"
: "=q" (x)
: "i" (0x00000000faceffff) );
return x;
}
现在,clang -S code.c
生成以下程序集:
#APP
movq $-87097345, %rax # imm = 0xFFFFFFFFFACEFFFF
#NO_APP
gcc 也是如此。 movabsq
代替 movq
也是一样。与 "p"
约束相同,而不是 "i"
。
如果常量大于 32 位,我会得到我期望的结果。
是否有常量的后缀以在 gcc 中将它们声明为 unsigned long long?对于 Microsoft 编译器,在本例中为“...ull” 0x00000000faceffffull。