[英]Inline asm: move imm to a 64-bit register without sign-extension
我想使用内联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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.