読者です 読者をやめる 読者になる 読者になる

NASMでアセンブリ言語入門(2)

アセンブリ言語

前回のは余りにも何も情報がなかったので今回はある程度情報のある感じで書いてみました。

はっきり言って初心者なので、いい書き方になっているかどうかはわかりません。

とりあえず、どこかのホームページでAからZまでのアルファベットを表示するという課題があったので作ってみました。

section .text
global _start

_start:
mov	al, 0x41		;'A'のASCIIコード 0x41

output:
push	eax			;eaxをスタックに退避
mov	eax, 4		;write
mov	ebx, 1		;標準出力
mov	ecx, esp		;スタックのアドレス
mov	edx, 1		;出力文字数
int	0x80			;システムコール呼び出し
pop	eax			;スタックから一つeaxに取り出す

inc	al			;alレジスタをインクリメント
cmp	al, 0x5b		;0x5b(ASCIIコードの'Z'0x5aの次)と比較
jnz	output		;上の比較が偽ならラベルoutputに飛ぶ

call	newline		;サブルーチンnewlineの呼び出し

mov	eax, 1		;exit
mov	ebx, 0		;終了ステータス
int	0x80			;システムコール呼び出し

;改行用サブルーチン
newline:
mov	al, 0x0a		;改行文字
push	eax			;eaxを退避
mov	eax, 4		;write
mov	ebx, 1		;標準出力
mov	ecx, esp		;スタックのアドレス
mov	edx, 1		;出力文字数
int	0x80			;システムコール呼び出し
pop	eax			;スタックからeaxに取り出す
ret				;呼び出し元に戻る

という感じです。
実行すると

$ABCDEFGHIJKLMNOPQRSTUVWXYZ

となるはずです。
前回よりは大分プログラムっぽい感じにはなっています。
スタック処理や比較、ジャンプ、サブルーチン呼び出しがおこなわれています。

まだまだ全然簡単なプログラムではありますが、もっと精進してみたいとは思います。

ついでですが、前回書き忘れたコンパイル方法です。
Linuxにnasmをインストールした後、コマンドで

$nasm -f elf ソースコード名
$ld -s -o 実行ファイル名 ソースコード名.o
$実行ファイル名

のようにすれば動きます。面倒くさがりな人はスクリプトで上の処理を書いておくと便利かもしれません。

広告を非表示にする