内联asm:将imm移动到64位寄存器而不使用符号扩展名

时间:2015-08-13 16:45:52

标签: c x86-64 inline-assembly

我想使用内联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位,我得到了我期望的结果。

1 个答案:

答案 0 :(得分:3)

是否有常量后缀用gcc将它们声明为unsigned long long?有了微软的编译器,它就会......#ull"在这种情况下为0x00000000faceffffull。