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"