素人プログラマがアセンブラでHello worldに挑戦してみた。

C言語入門→アセンブラ入門

最近、もっとコンピュータをちゃんと理解できるようになりたいと思ってC言語の勉強を始めました。
「コンピュータやOSと直に会話している世界」に触れられるかもしれないと勝手に想像していたのですが、実際やってみたら予想と違って「PHP/Perlと似たようなもう一つの言語」を勉強している感覚に襲われました。

PHPもPerlもC言語も、あくまで「変数に値を代入する」という感覚であって、「メモリという物体にデータを書き込む」という感覚ではないんですよね。
そこで、毒を食らわば皿までもということで、アセンブラに入門してみました。

(環境はUbuntu9.10 32bitです。)

アセンブラ処理系NASMをインストールする

sourceforgeのサイトから、処理系(コンパイラ?)のソースコードをダウンロードできます。

$ wget "http://sourceforge.net/projects/nasm/files/nasm%20sources/2.07/nasm-2.07.tar.gz/download"
$ tar xvfz nasm-2.07.tar.gz
$ cd nasm-2.07
$ ./configure
$ make
$ su
# make install

サンプルコードHello World

下記コードを ファイル名hello.asm で保存します。

section .text
            global _start       ;リンカのための宣言

_start:                         ;リンカに開始ポイントを伝える
        mov     edx,len         ;メッセージの長さ
        mov     ecx,msg         ;メッセージ
        mov     ebx,1           ;標準出力を指定
        mov     eax,4           ;システムコール番号 (sys_write)
        int     0x80            ;システムコール

        mov     eax,1           ;システムコール番号 (sys_exit)
        int     0x80            ;システムコール

        section .data

        msg     db      'Hello, world!',0xa       ;メッセージ文字列
        len     equ     $ - msg                  ;文字列の長さ

実行する。

$ nasm -f elf hello.asm && ld -s -o hello hello.o && ./hello

hello, world
できた!!

感動した!!

参考:Linux でアセンブリプログラミング
カテゴリ: