从64位地址加载到rax以外的其他寄存器

Tor*_*gny 9 assembly x86-64

在x64上,可以通过以下方式从64位绝对地址加载(即,取消引用64位立即数)

movabs addr64, %rax
Run Code Online (Sandbox Code Playgroud)

但是,当目标寄存器不是rax汇编程序给出错误消息时operand size mismatch for movabs.我错过了什么?

phu*_*clv 7

从MOV指令文档中可以看到,您可以将64位立即数移动到任何寄存器,但涉及64位立即绝对地址的加载/存储只能用于Areg

A0          MOV AL,moffs8*      Move byte at (seg:offset) to AL.
REX.W + A0  MOV AL,moffs8*      Move byte at (offset) to AL.
A1          MOV AX,moffs16*     Move word at (seg:offset) to AX.
A1          MOV EAX,moffs32*    Move doubleword at (seg:offset) to EAX.
REX.W + A1  MOV RAX,moffs64*    Move quadword at (offset) to RAX.
A2          MOV moffs8,AL       Move AL to (seg:offset).
REX.W + A2  MOV moffs8***,AL    Move AL to (offset).
A3          MOV moffs16*,AX     Move AX to (seg:offset).
A3          MOV moffs32*,EAX    Move EAX to (seg:offset).
REX.W + A3  MOV moffs64*,RAX    Move RAX to (offset).
Run Code Online (Sandbox Code Playgroud)

如您所见,没有ModR/M字节来编码寄存器编号.由于这比将64位立即数移动到寄存器更常用,因此不会有问题.如果确实需要,可以在2条指令中完成

MOVABS对于该气体名称码MOV码形式MOV Areg, [Offs64]和MOV [Offs64], Areg.在Yasm的NASM语法模式中,您可以通过说明来获得此表单MOV AX, [qword xxx].Yasm的GAS语法模式接受MOVABS(用于GAS兼容性).

请注意,此表单仅在Areg(AL/AX/EAX/RAX)作为源/目标寄存器时有效.*

http://cvs.tortall.net/pipermail/yasm-devel/2006-March/000579.html

  • @CiroSantilli六四事件法轮功我认为`mov r64, imm64`对所有寄存器都有效,但`mov Areg, addr64`仅对A寄存器有效。“`movabs %al,0xe400000000004049` 应该将 al 的值存储在地址 0xe400000000004049 中,因此它不会将立即值移入/移出寄存器 http://www.cplusplusdevelop.com/508_9928837/ (2认同)
  • `movabs $0x1000000000000000, %rax` 类似于 `mov rax, 0x1000000000000000` 但`movabs 0x10000000000000000, %rax` 类似于`mov rax, 00000000000000000000000000 (2认同)
  • 啊,好的,_dereferencing_立即. (2认同)