アンティーク・アセンブラ~Antique Assembler

第1回 骨董的アセンブラへの招待

この記事を読むのに必要な時間:およそ 3.5 分

環境の準備

次回からは,実際にアセンブラプログラムの実装を行いますが,まずはそのための環境を準備しましょう。

前提条件

プログラムを例示する便宜上,この連載では対象CPUアーキテクチャを32ビットIntel 80x86,記述をAT&Tニーモニックに限定したいと思います。

現時点で一般ユーザの利用が最も容易なCPUアーキテクチャ,という視点で見た場合,32ビットIntel 80x86という選択に異論のある方は居ないでしょう。

また,UNIX系OSやCygwin環境といった広範な環境での可用性(入手容易性含む)を考えて,後述するように本連載ではアセンブラ処理系としてGNU Assemblerを想定しますので,例示するプログラムはIntelニーモニックではなく,GNU Assemblerが受け付けることのできるAT&Tニーモニックで記述します。

なお,宗教論争に巻き込まれるのを避けるため,32ビットIntel 80x86アーキテクチャの優劣や,両ニーモニックの優劣に関しては,ここでは言及しません。

こうやって振り返ってみると,ソフトウェア界隈が如何に宗教論争に満ち溢れているのかがわかります。

もっとも,そういった瑣末事項に関する粘着的な拘りが多少なりとも無ければ,ソフトウェアなどという七面倒臭いものはやっていられない気もしますが…

ちなみに,本連載は「Intel 80x86によるアセンブラの入門」なのですが,⁠Intel 80x86のアセンブラ」よりは「アセンブラの入門」の方に軸足を置きますので,他のCPUアーキテクチャの話題にも触れる一方で,Intel 80x86に関する説明の網羅性はあまり重視しない予定です。

利用するツール

本連載では以下のツールが必要となりますので,事前に準備をしてください。

アセンブラ(asコマンド)
リンカ(ldコマンド)

これらのツールは,C/C++コンパイラが利用可能になっている環境なら,改めてインストールする必要は無いはずです。

本連載の実行例でこれらのコマンドに指定するオプションは,GNU AssemblerおよびGNU Linker(これらは共にGNU Binutilsの一部です)を想定したものですが,他の実装でも概ね共通なはずです。

動作確認したGNU Binutilsのバージョンは,2.11.90(Linux⁠⁠,2.15.92(Linux)および2.18.50(Cygwin)です。

デバッガ

プログラムの動作確認を画面表示やファイル入出力によって行うためには,いわゆるお作法に沿った記述によるプログラム量の増加が避けられません。

そこで本連載では,プログラムの動作確認をデバッガ経由で行うことで,プログラムの記述量を最小限に抑えることにします。

本連載の実行例では,GDB: GNU Project Debugger(gdbコマンド)を使用します。

動作確認したGDBのバージョンは,5.0(Linux⁠⁠,6.4.90(Linux)および6.8.0(Cygwin)です。

環境の確認

ツールが一通り揃ったならば,想定通りに機能することを確認しましょう。

まずはリスト1の内容を,ファイル名0001.sで保存してください。

リスト10001.s

    .data
    .align  4

    .global value
value:
    .long   1

    .text
    .align  4

    .global entry_point
entry_point:
    int3        # プログラム実行の一時停止
    movl    $2, value

    .global end_of_program
end_of_program:
    int3        # プログラム実行の一時停止
    nop

コメントに日本語を使用する場合,ファイル保存の際の文字コードにShift-JIS(正式にはWindows-31JないしCP932)を使用すると,2バイト目にバックスラッシュと同じ値を持つ文字が行末に来た場合に,asコマンドが想定外の振る舞いをする可能性があります。

コメントに日本語を使用するのであれば,日本語EUCやUTF-8等の,紛らわしいバイトを含まない文字コードを使用することをお勧めします。

ファイルに保存したなら,まずは図2の手順で実行可能ファイル0001.exeを生成します。手順上,実際に入力する内容は太字で示した部分です。

図2 実行ファイルの生成

$ as -o 0001.o 0001.s
$ ld -o 0001.exe -e entry_point 0001.o
$

実行可能ファイルが生成できたら,図3の手順で実際にプログラムを実行してみましょう。

本連載では説明の便宜上,gdbをCUI(character user interface)形式で使用します。gdb起動の際にGUIが立ち上がるのであれば,起動時に-nwオプションを追加指定してください。

図3 プログラムの実行

$ gdb 0001.exe
GNU gdb ....(省略)....
(gdb) run ※ 実行開始
Starting program: ....(省略)
....
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00401001 in entry_point ()
    ※ entry_point で一時停止(アドレスは環境によって異なります)
(gdb) print value
$1 = 1
(gdb) continue ※ 実行再開
Continuing.

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0040100c in end_of_program ()
    ※ end_of_program で一時停止
(gdb) print value
$2 = 2
(gdb) quit
The program is running.  Exit anyway? (y or n) y
$

確認用プログラムは,初期値1のvalue領域に2を代入するプログラムですので,プログラムの最後end_of_programに到達した際に,"print value"の結果出力(コマンド入力次行の右辺)が2となれば,期待通りに動作していることになります。

以上で準備は完了です。

次回以降は,いよいよ本格的にアセンブラプログラムの実装を行います。

著者プロフィール

藤原克則(ふじわらかつのり)

Mercurial三昧の日々が嵩じて, いつの間にやら『入門Mercurial Linux/Windows対応』を上梓。凝り性なのが災いして,年がら年中アップアップな一介の実装屋。最近は仕事の縁が元で,OpenSolarisに入れ込む毎日。