L.Entisの日記: 【MASM談義】 1. x86あらまし
日記 by
L.Entis
【歴史】
x86 系と呼ばれる命令セットは、古くは8ビットCPUである80系(8080)にまでさかのぼることが出来ます。
8ビットCPUである 8080 と、16ビットCPUである 8086 はバイナリレベルでの互換性はありませんが、命令セットは受け継いでおり(ニーモニックは変更されましたが)、8086 に対応したアセンブラで 8080 用のニーモニックコードをそのままアセンブルすることが出来ました。
32ビット化されたときにずいぶんアーキテクチャが変更されたとはいえ、8086 以降バイナリレベルでの互換性が保たれているため、汎用レジスタが8本しかないことや、8ビットの変則的なパーシャルレジスタ(ah, bh, ch, dh)など、未だに8ビット時代の名残を見ることが出来ます。
【ニーモニック】
ニーモニックは一般的に次の形式をとります。
(命令) (出力オペランド), (入力オペランド)
x86 ニーモニックには主に以下のオペランド形式があります。
imm
reg/mem
reg/mem, reg
reg, mem
reg/mem, imm
reg, reg/mem, imm8
reg はレジスタ、reg/mem はレジスタまたはメモリオペランドです。
imm は整数、imm8 は8ビットの整数です。
【メモリオペランド】
メモリオペランドには以下の形式があります。(32ビットモード)
[disp32]
[base]
[base + disp]
[index * scale + disp32]
[base + index * scale]
[base + index * scale + disp]
disp は8ビットまたは32ビット整数で、8ビットの場合には符号ビットが拡張されます。disp32 は32ビット整数です。
base 及び index は任意の汎用レジスタ(eax,ebx,ecx,edx,esi,edi,ebp,esp、但し index に esp は不可)です。
scale は 1, 2, 4, 8 のいずれかとなります。
MASM ではメモリをあらわすのに [expr] の形式を取りますが、[expr][expr] のようにオフセットアドレスを記述することが可能で、これは [expr+expr] と同じ意味になります。
変数名シンボルを使う場合には [ ] 記号は使わず、直接変数名を記述します。
構造体のメンバへアクセスする場合にも [expr].member[expr] のように任意にオフセットを記述できますが、上記形式の通り、レジスタ要素は2つまでしか使用できないことに注意が必要です。
▼ 【MASM談義】 0. 導入編
x86 系と呼ばれる命令セットは、古くは8ビットCPUである80系(8080)にまでさかのぼることが出来ます。
8ビットCPUである 8080 と、16ビットCPUである 8086 はバイナリレベルでの互換性はありませんが、命令セットは受け継いでおり(ニーモニックは変更されましたが)、8086 に対応したアセンブラで 8080 用のニーモニックコードをそのままアセンブルすることが出来ました。
32ビット化されたときにずいぶんアーキテクチャが変更されたとはいえ、8086 以降バイナリレベルでの互換性が保たれているため、汎用レジスタが8本しかないことや、8ビットの変則的なパーシャルレジスタ(ah, bh, ch, dh)など、未だに8ビット時代の名残を見ることが出来ます。
【ニーモニック】
ニーモニックは一般的に次の形式をとります。
(命令) (出力オペランド), (入力オペランド)
x86 ニーモニックには主に以下のオペランド形式があります。
imm
reg/mem
reg/mem, reg
reg, mem
reg/mem, imm
reg, reg/mem, imm8
reg はレジスタ、reg/mem はレジスタまたはメモリオペランドです。
imm は整数、imm8 は8ビットの整数です。
【メモリオペランド】
メモリオペランドには以下の形式があります。(32ビットモード)
[disp32]
[base]
[base + disp]
[index * scale + disp32]
[base + index * scale]
[base + index * scale + disp]
disp は8ビットまたは32ビット整数で、8ビットの場合には符号ビットが拡張されます。disp32 は32ビット整数です。
base 及び index は任意の汎用レジスタ(eax,ebx,ecx,edx,esi,edi,ebp,esp、但し index に esp は不可)です。
scale は 1, 2, 4, 8 のいずれかとなります。
MASM ではメモリをあらわすのに [expr] の形式を取りますが、[expr][expr] のようにオフセットアドレスを記述することが可能で、これは [expr+expr] と同じ意味になります。
変数名シンボルを使う場合には [ ] 記号は使わず、直接変数名を記述します。
構造体のメンバへアクセスする場合にも [expr].member[expr] のように任意にオフセットを記述できますが、上記形式の通り、レジスタ要素は2つまでしか使用できないことに注意が必要です。
▼ 【MASM談義】 0. 導入編
【MASM談義】 1. x86あらまし More ログイン