Jun's Homepage

玄箱PRO、Linux ZaurusでARMアセンブリプログラミング

copyright (C) 2003-2012 Jun Mizutani

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"

Jun's Homepage

  • HOME に戻る
  • 前のページ
  • 次のページ
  • webg:WebGPU 3Dライブラリ
  • Blender
  • Raspberry Pi メモ
  • rvtl:Tiny Basic
  • ARM64 アセンブリ
  • ARM アセンブリ
  • x86 アセンブリ
  • x86-64 アセンブリ
  • PowerPC アセンブリ

ARM アセンブリ

  • はじめに
  • 1. アセンブラのインストールと実行
  • 2. ARMのレジスタ
  • 3. 演算命令と分岐命令
  • 4. ロード/ストア命令
  • 5. ロード/ストア命令(複数レジスタ)
  • 6. システムコールとその他の命令
  • 7. アセンブラGNU asの基礎知識
  • 8. 標準入出力用のサブルーチンの作成
  • 9. フレームバッファでグラフィックス - その1
  • A. システムコールと引数一覧
  • B. インタプリタの作成

Raspberry Pi メモ

  • Raspberry Pi メモ 目次
  • ★ 逆引き Raspberry Pi メモ ★
  • (1) Raspberry Pi到着
  • (2) ブート用SDカードの作成
  • (3) アセンブリで浮動小数点数表示
  • (4) 軽く三次元
  • (5) ベクトル演算の実力
  • (6) 転んでも泣かない!
  • (7) OpenGL ES2 (1) 概要
  • (8) OpenGL ES2 (2) 初期化
  • (9) 公式オーバークロック
  • (10) OpenGL ES2 (3) シェーダの使い方
  • (11) OpenGL ES2 (4) 三次元で三角形
  • (12) OpenGL ES2 (5) テクスチャ
  • (13) OpenGL ES2 (6) シェーダで照明
  • (14) 新wheezy-raspbian と「まとめ」
  • (15) Tiny BASIC と ASLR
  • (16) 新イメージ 2012-12-16
  • (17) 各種言語のベンチマーク
  • (18) Pi専用の Minecraft の使い方
  • (19) LuaJITでお手軽3D (1)
  • (20) LuaJITでお手軽3D (2) LjESリリース
  • (21) 新 raspbian と Wayland/Weston
  • (22) LuaJITでお手軽3D (3) NodeとShape
  • (23) カメラモジュールの使い方
  • (24) 2013-09-25-wheezy-raspbian と「まとめ」
  • (25) LuaJITでお手軽3D (4) テクスチャマッピング
  • (26) raspbian(2013-12-20)とMathematica
  • (27) RPI Expansion Board (X100)のレビュー
  • (28) 液晶ディスプレイ一体型PC
  • (29) LuaJITでお手軽3D (5) LjES-2 リリース
  • (30) GPIO とシャットダウンボタン
  • (31) Lua でオブジェクト指向
  • (32) 新Raspbianとリアルタイムクロック
  • (33) 2014-09-09-wheezy-raspbian のインストール
  • (34) デスクトップの軽量な日本語化
  • (35) デスクトップのカスタマイズ
  • (36) 2014-12-24-wheezy-raspbian の変更点
  • (37) Java8 プログラミング
  • (38) Raspberry Pi でラムダ式
  • (39) Raspberry Pi 2 始動
  • (40) Raspberry Pi2 の互換性
  • (41) ゲームパッドでシャットダウン
  • (42) Raspberry Pi2 の非互換性とGPIO
  • (43) Node.js で JavaScript
  • (44) ハードディスク起動とヘアピンNAT
  • (45) 2015-05-05版と新しい無線LAN設定方法

アセンブリ言語シリーズ

  • PowerPC アセンブリ
  • ARM アセンブリ
  • ARM64 アセンブリ
  • x86 アセンブリ
  • x86-64 アセンブリ

ARM64 アセンブリ

  • 0. はじめに
  • 1. メモリ、バイト、エンディアン
  • 2. アセンブラのインストール
  • 3. ARM64 のレジスタ
  • 4. ロード命令
  • 5. ストア命令
  • 6. 演算命令
  • 7. シフト命令
  • 8. 条件分岐、システムコール
  • 9. 浮動小数点レジスタと命令
  • 10. 浮動小数点数の表示
  • 11. 浮動小数点数のロード/ストア命令
  • 12. ベクトルのロード/ストア命令
  • 13. 浮動小数点数のレジスタ間移動命令
  • つづく...

  • インタプリタの作成
  • Dragonboard 410C のインストール
  • 仮想 Arm64 マシンの作り方
  • HiKey のインストール
  • Orange Pi PC2 の性能と Ubuntu のインストール
  • Raspberry Pi2、Orange Pi Zero/PC2 の UnixBench

アセンブリ言語シリーズ

  • PowerPC アセンブリ
  • ARM アセンブリ
  • x86 アセンブリ
  • x86-64 アセンブリ

ご意見・ご感想は,こちらの掲示板まで。

71336