Closed5

x86 の MOV命令が読めない

wintwint

モチベ

x86 のアセンブリには MOV命令があるけど、(特に Intel記法の)メモリ・アドレッシングが読めない。

例えば、ロードやストア:

mov rax, [rbx]
mov [rbx], rax

ちなみに x86 の mov 命令は ムダに 高機能なことで知られてる。

前提

自分は RISC-V の命令フォーマットはざっくり知ってる。

wintwint

オペランドのパターン

記号 意味
r8 8ビットレジスタ
r16 16ビットレジスタ
r32 32ビットレジスタ
r64 64ビットレジスタ
r/m8 8ビットレジスタ、または 1 バイトのメモリ
r/m16 16ビットレジスタ、または 2 バイトのメモリ
r/m32 32ビットレジスタ、または 4 バイトのメモリ
r/m64 64ビットレジスタ、または 8 バイトのメモリ
m8 1 バイトのメモリ
m16 2 バイトのメモリ
m32 4 バイトのメモリ
m64 8 バイトのメモリ
imm8 8ビット定数
imm16 16ビット定数
imm32 32ビット定数
imm64 64ビット定数
AL RAXレジスタの下位 8 ビット
AX RAXレジスタの下位 16 ビット
EAX RAXレジスタの下位 32 ビット

出典

https://www.mztn.org/lxasm64/amd06_sum.html

wintwint

実際のエンコード

オペコードとオペランドの対応付けを考えてみる。特にMOV命令だけ考える。

MOV ストア

mov [rbx], rax
Opcode Mnemonic Description
88 /r MOV r/m8,r8 Move r8 to r/m8.
89 /r MOV r/m16,r16 Move r16 to r/m16.
89 /r MOV r/m32,r32 Move r32 to r/m32.

MOV ロード

mov rax, [rbx]
Opcode Mnemonic Description
8A /r MOV r8,r/m8 Move r/m8 to r8.
8B /r MOV r16,r/m16 Move r/m16 to r16.
8B /r MOV r32,r/m32 Move r/m32 to r32.
wintwint

雰囲気わかった気がするので閉じる。

このスクラップは2021/08/26にクローズされました