繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM