内联汇编:将imm移至没有符号扩展的64位寄存器

弗拉迪斯拉夫·伊万申(Vladislav Ivanishin)

我想使用内联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位,我会得到预期的结果。

rcgldr

常量是否有后缀,可以使用gcc将它们声明为unsigned long long?对于Microsoft编译器,本例中为“ ... ull” 0x00000000faceffffull。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 Thumb 模式下将寄存器符号扩展为 64 位(设置所有位 = 符号位)

汇编 IA-32:如何将 64 位有符号数除以奇数(存储在 2 个寄存器中)

x86_64内联汇编; 直接将64位寄存器复制到64位存储器位置

无法在GCC内联汇编中强制使用64位寄存器

有没有办法在arm64中将32位寄存器复制到64位寄存器中?

C ++中的扩展内联汇编:是否有必要保留易失性寄存器?

用汇编语言x86将32位寄存器[esi]的内存地址移至8位低寄存器

没有32位寄存器的32位/ 16位有符号整数除法?

汇编寄存器采用64位体系结构

将 32 位有符号整数存储到寄存器中的具体细节是什么?

汇编程序编程-将32位寄存器的内容移动到16位寄存器?

汇编语言:64位寄存器的8位版本?

使用内联汇编检索 x64 寄存器值

PowerPC 内联汇编:将 C 值加载到寄存器中

C ++内联汇编试图将字符从字符串复制到寄存器中

如何在没有多个指令的情况下将汇编中的所有寄存器清零?

arm gcc 汇编与 FPU 寄存器内联

watcom内联汇编收到错误“非法使用寄存器”

gcc如何知道用于内联汇编的寄存器大小?

Z80汇编:如何将带符号的8位值添加到16位寄存器?

如何在扩展的GCC内联汇编中将输入操作数(C寄存器变量)标记为混乱的输入?

是否有必要在内联汇编中初始化所有使用的寄存器?

蒙哥马利乘法 - 32 位寄存器与 64 位寄存器

在64位ASM中。有没有一种很好的方法来仅注意寄存器的低32位

为什么32位寄存器上的x86-64指令将整个64位寄存器的高位归零?

x86 64 AT&T,将寄存器的一部分移至另一个寄存器

在单臂霓虹灯寄存器中有效地将8位数字扩展到12位

将 32 位寄存器移入 8 位寄存器

AVR 汇编:将一个 16 位数字加载到两个 8 位寄存器中