簡體   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