我想使用内联asm将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位,我得到了我期望的结果。
答案 0 :(得分:3)
是否有常量后缀用gcc将它们声明为unsigned long long?有了微软的编译器,它就会......#ull"在这种情况下为0x00000000faceffffull。