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