我可以将64位常数添加到64位寄存器吗?

use*_*035 5 assembly x86-64

在我的64位Intel机器下面代码工作:

mov rdi, 1 << 40
add r10, rdi
Run Code Online (Sandbox Code Playgroud)

而这相当于一个产生警告并且不起作用:

add r10, 1 << 40
Run Code Online (Sandbox Code Playgroud)

我应该坚持1号还是我错过了什么?这种行为似乎很尴尬.

代码nr 2产生的警告:

warning: signed dword immediate exceeds bounds
Run Code Online (Sandbox Code Playgroud)

Gri*_*wes 8

有一个操作码mov r/m64, imm64,但add r/m64, imm64x86-64指令集中没有操作码.换句话说:你不能使用64位立即数操作add,但是你可以使用mov(有许多指令没有imm64变量;你可以查看英特尔软件开发人员手册中的指令集参考来检查哪些指令有这样的指令变体,但没有).

  • 事实上,`mov` 是*唯一* 使用`imm64` 的指令。请参阅 [Intel 的 insn set ref 手册条目`mov`](https://github.com/HJLebbink/asm-dude/wiki/MOV)。(还有一个特殊的 AL/AX/EAX/RAX-only `moffs` 形式,它不使用常规寻址模式,并允许 64 位绝对地址)。但是 `mov r64, imm64` 适用于任何 reg。 (3认同)