我想使用内联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位,我会得到预期的结果。
常量是否有后缀,可以使用gcc将它们声明为unsigned long long?对于Microsoft编译器,本例中为“ ... ull” 0x00000000faceffffull。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句