パスワードを忘れた? アカウント作成
63409 journal

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. 導入編
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...