アセンブラ理解度

[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