アセンブラ理解度
[id:w_o:20051006:p1]
アセンブラを少しだけ理解したので、ここのコードを分析してみる。
org 100h
まず、実行開始番地を指定。COM実行形式の実行ファイルの場合は、これを書きます。
section .text
コードセクションの開始。セクションは、コード(.text)、データ(.data)、初期化されていないデータ(.bss)などがある。
start: mov cl, 4 (中略) loop tableload
CXレジスタ(2バイト)を用いたループを作成する。LOOPコマンドは、CXレジスタから1引いて0でなければラベルにジャンプする命令。
mov ah, 02h
後の割り込み(int 21h)時の命令を事前にahレジスタ(1バイト)にセット。
02hは、「1文字出力する」という命令。
mov bx, table (中略) table: dw (26<<8)|'A' dw (26<<8)|'a' dw (10<<8)|'0' dw (1<<8)|'_'
bxレジスタ(2バイト)にtableで宣言されたデータへのポインタをセット。
tableデータは、「2バイト×4」のデータで、上位1バイトが繰り返し回数、下位1バイトが初期値です。
※ 4バイト単位の場合はdd、2バイト単位の場合はdw、1バイト単位の場合はdb
tableload: mov dx, [bx]
bxレジスタ(2バイト)が指すデータを、dxレジスタ(2バイト)に読み込む。
outstr: int 21h
dlレジスタ(1バイト)のデータ(1文字)を、出力する。
dlレジスタは、dxレジスタの下位1バイト。
inc dx
dxレジスタ(2バイト)をインクリメントする。実質的に、dlレジスタ(1バイト)をインクリメントして、出力文字を次の文字に進めている。
dec dh
dhレジスタ(1バイト)をデクリメントする。dhレジスタは、dxレジスタの上位1バイトで、カウンタとして利用している。
演算結果が0になると、ZFフラグが1になる。
jnz outstr
ZFフラグが0(演算結果がゼロでない)であれば、outstrラベルにジャンプする。
inc bx inc bx
bxレジスタ(2バイト)に格納されたアドレス(tableデータを指す)を2バイト分進める。
loop tableload
CXレジスタから、1引いて0でなければtableloadラベルにジャンプ。CXレジスタには、冒頭で4がセットされている。
ret
終了。
参考)
http://hp.vector.co.jp/authors/VA003988/asm.htm
http://hp.vector.co.jp/authors/VA016117/assem/assem.html