Closed5
x86 の MOV命令が読めない
モチベ
x86 のアセンブリには MOV命令があるけど、(特に Intel記法の)メモリ・アドレッシングが読めない。
例えば、ロードやストア:
mov rax, [rbx]
mov [rbx], rax
ちなみに x86 の mov 命令は ムダに 高機能なことで知られてる。
前提
自分は RISC-V の命令フォーマットはざっくり知ってる。
サーベイ
MOV命令は複数のオペコードに対応するようだ
r/m8
とか r16
みたいなのは、REXプレフィックスとレジスタコードに関わりが深そうだ
r/m
はレジスターかメモリーかを選択可能だという程度の意味だろう
オペランドのパターン
記号 | 意味 |
---|---|
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 ビット |
出典
実際のエンコード
オペコードとオペランドの対応付けを考えてみる。特に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. |
雰囲気わかった気がするので閉じる。
このスクラップは2021/08/26にクローズされました