前回のは余りにも何も情報がなかったので今回はある程度情報のある感じで書いてみました。
はっきり言って初心者なので、いい書き方になっているかどうかはわかりません。
とりあえず、どこかのホームページで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 $実行ファイル名
のようにすれば動きます。面倒くさがりな人はスクリプトで上の処理を書いておくと便利かもしれません。