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

Assembly 我可以将64位常量添加到64位寄存器吗?,assembly,x86-64,nasm,immediate-operand,Assembly,X86 64,Nasm,Immediate Operand,在我的64位Intel机器上,以下代码起作用: mov rdi, 1 << 40 add r10, rdi 在x86-64指令集中,有用于mov r/m64,imm64的操作码,但没有用于add r/m64,imm64的操作码。换句话说:您不能对add使用64位立即数操作数,但可以对mov使用64位立即数操作数(有许多指令没有imm64变体;您可以查看《英特尔软件开发人员手册》中的指令集参考,以检查哪些指令有这种变体,哪些指令没有这种变体).事实上,mov是唯一接受imm64的指令

在我的64位Intel机器上,以下代码起作用:

mov rdi, 1 << 40
add r10, rdi

在x86-64指令集中,有用于
mov r/m64,imm64
的操作码,但没有用于
add r/m64,imm64
的操作码。换句话说:您不能对
add
使用64位立即数操作数,但可以对
mov
使用64位立即数操作数(有许多指令没有
imm64
变体;您可以查看《英特尔软件开发人员手册》中的指令集参考,以检查哪些指令有这种变体,哪些指令没有这种变体).

事实上,
mov
是唯一接受
imm64
的指令。看见(还有一种特殊的AL/AX/EAX/RAX-only
moffs
表单,它不使用常规寻址模式,并允许使用64位绝对地址)。但是
mov r64,imm64
适用于任何寄存器相关::如果符号扩展的imm32不起作用,通常最好将
mov
常量添加到寄存器中,就像ALU指令一样,如
add
。同样相关。是这个的气体版本;有用的错误消息要少得多,但会出错,而不是警告和编码错误的值。如果该值在内存中,则只需对高位部分执行32位加法:
add dword ptr[var+4],(1>32
add r10, 1 << 40
warning: signed dword immediate exceeds bounds