1.アセンブラのインストールと実行

Linux Zaurus用にコンパイルしたbinutilsをipkパッケージにしてみました。 アセンブラによるセルフ開発ができるようになります。 binutils_2.13.2.1-1_arm.ipk のダウンロード (1,033KB)

binutils_2.13.2.1-1_arm.ipk をメニューの「ソフトウェアの追加と削除」アイコンから binutils を選択して、本体メモリにインストールしてください。
/usr/local/binutils/bin/as のように実行するのは面倒ですから、.bashrcに 下記の行を追加してパスを通しておきます。

~$ export PATH=/usr/local/binutils/bin/:$PATH

/home/zaurus に .bashrc がない(ls -la で確認)場合は、例えば次のような内容で作成してください。

export PS1='\w\$ '
export PATH=/usr/local/binutils/bin/:$PATH

次のように実行できればOKです。

~$ as --version
GNU assembler 2.13.2.1
Copyright 2002 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License. This program has absolutely no warranty.
This assembler was configured for a target of `arm-linux'.

binutilsでインストールされるコマンドの一覧を以下に示します。通常は上から4つのコマンド (as:アセンブラ、ld:リンカ、strip:実行ファイルのサイズ縮小、objdump:逆アセンブラ) 以外は あまり使わないと思います。

コマンド 説明
as GNU as アセンブラ
ld GNU linker リンカ
strip オブジェクトファイル中のシンボルを削除
objdump オブジェクトファイルの各種情報の表示
gprof GNU profiler プロファイラ
nm オブジェクトファイル中のシンボルの表示
objcopy オブジェクトファイルの内容のコピー
ar アーカイバ
ranlib アーカイブの内容のインデックスを生成
readelf ELFフォーマットファイルの内容を表示
size セクションのサイズの表示
strings ファイルの印刷可能文字の一覧表示
c++filt C++で生成されたシンボルのデコード
addr2line プログラムアドレスをファイル名と行番号に変換

サイズが大きくなるため、binutils_2.13.2.1-1_arm.ipkは manページ、infoファイル、日本語以外のロケールデータを除いてあります。インストールすると本体メモリを 2.6MB 使います。

~$ du /usr/local/binutils/
910     /usr/local/binutils/bin
360     /usr/local/binutils/lib
927     /usr/local/binutils/arm-linux/bin
110     /usr/local/binutils/arm-linux/lib/ldscripts
110     /usr/local/binutils/arm-linux/lib
1037    /usr/local/binutils/arm-linux
133     /usr/local/binutils/share/locale/ja/LC_MESSAGES
133     /usr/local/binutils/share/locale/ja
133     /usr/local/binutils/share/locale
133     /usr/local/binutils/share
185     /usr/local/binutils/include
2625    /usr/local/binutils

実際に簡単なアセンブリソースをアセンブルして実行してみましょう。アセンブリソースの 内容は今後解説していきますから、今はコマンドを実行して実際にアセンブルして見ましょう

まず、次のファイルを hello.s として保存します。

.text
        .align  2
        .global _start
_start:
        adr     r1, msg         @ address
        mov     r0, #1          @ stdout
        mov     r2, #13         @ length
        swi     #0x900004       @ sys_write

        mov     r0, #0
        swi     #0x900001       @ sys_exit

        .align  2
msg:
        .asciz  "hello, world\n"

アセンブルは次のように as コマンドを使います。下の例では hello.o というオブジェクト ファイルが生成されますが、-o で出力ファイル名を指定しない場合には、オブジェクトファイルは a.out というファイル名になります。

~$ as -o hello.o hello.s

実行可能なファイルを作成するには オブジェクトファイルをリンカ ld でリンクする必要があります。 -o で出力ファイル名を指定しない場合には、実行可能ファイルは a.out というファイル名になります。

~$ ld -o hello hello.o

アセンブル、リンクして生成された hello を実行します。普通はコマンドの検索パス (環境変数 PATH) にカレントディレクトリは含まれていないため、./ を まえに付けて ./hello のように実行する必要があります。

~$ ./hello
hello, world

コンソールに hello, world が表示されます。これでアセンブリ言語のソースプログラム hello.s が 実行できました。

コマンドラインからアセンブル、リンクのコマンドを毎回打ち込むのも面倒ですから、 次のスクリプトを用意します。

#!/bin/sh
as -o $1.o $1.s
ld -o $1 $1.o

asld という名前で保存して、chmod +x asld で実行属性を付けます。これで ./asld hello とすればアセンブルとリンクが連続して実行され、hello が生成できます。

~$ ./asld hello
~$ ls -l
-rwxr-xr-x    1 zaurus   qpe           932 Feb 11 11:26 hello
-rw-r--r--    1 zaurus   qpe           546 Feb 11 11:26 hello.o
-rwxr-xr-x    1 zaurus   qpe           347 Feb 11 11:26 hello.s
~$ ./hello
hello, world

make をインストールして、Makefile を使うこともできます。

arm eabi の場合

ARM系のCPUの場合、システムコールの方法やスタックの使い方を規定した Application Binary Interface (ABI) に 2種類あり、2009年頃から普及し始めた新しいABI は EABI (E は Embeddedの略で組み込みの意) と呼ばれます。 EABI に対して古い方の ABI を OABI と呼んで区別します。アセンブラレベルではシステムコールの呼出し方法が swi 命令にシステムコール番号を埋め込むOABIと異なり、EABIではレジスタ(r7)にシステムコール番号を設定して swi 命令を実行します。

.text
        .align  2
        .global _start
_start:
        adr     r1, msg         @ address
        mov     r0, #1          @ stdout
        mov     r2, #13         @ length
        mov     r7, #4          @ sys_write
        swi     0

        mov     r0, #0
        mov     r7, #1          @ sys_exit
        swi     0

        .align  2
msg:
        .asciz  "hello, world\n"