アセンブラの基本動作
アセンブラの動作
- コンパイラが生成したアセンブラソース、または開発者がコーディングしたアセンブラソースを読込み、オブジェクトファイルを生成する。
- アセンブラソース → 機械語とほぼ一対一で対応するソース
アセンブラの使いこなし
- 記述方法や文法はプロセッサ毎に異なる。
- コードを書くシチュエーションは限られので、書く能力は必要な時に学習すればよい。
- コードを読める必要がある。
- デバッガ/逆アセンブラの出力、コンパイルリスト等々の解読のため。
基本的なフォーマット
- アセンブラは行指向の言語
- ラベル部(終端が”:”の場合が多い)
- オペコード部(プロセッサの命令または疑似命令)
- オペランド部(”,”で区切られ複数記述できる場合が多い)
- コメント部(”#”,”;”,”*”,”@”等で開始される場合が多い)
プロセッサの命令
- 転送命令(レジスタ⇔メモリ/レジスタ)
- 演算命令(加減乗除、論理演算、シフト等々)
- 分岐命令(ジャンプ、条件付きジャンプ、コール等々)
- 制御命令(割込み禁止/許可等々)
mov | レジスタ間のコピー |
stmfd | 複数のレジスタ値のストア |
sub | レジスタ間の減算 |
str | レジスタ値のストア |
ldr | レジスタ値のロード |
bl | サブルーチン呼び出し |
ldmfd | 複数のレジスタ値のロード |
疑似命令
- アセンブラには直接プロセッサーが理解しない命令(オペコード)がある。これはアセンブラに対する指示で、オブジェクトコードの生成方法を指示、定数値を指定、シンボルの属性を指定等々の処理を行う。
- セクション制御
- text,data,bss等のセクション制御命令
- 各種の宣言
- 外部シンボルの定義やシンボルの公開
- デバッグ情報、その他
- 主にコンパイラが生成する行番号情報など
- アセンブル制御、マクロ機能、データ定義
セクション
- プログラム中で使われるデータや命令はセクションと呼ばれるグループに配置される。.section, .text等の疑似命令で指示。
- これは命令語とデータでMPUがアクセスする時の属性が異なり、メモリに付加する情報(実行許可等)を制御する必要があるため。(組込み系ではROM/RAMの指定等に用いる)
- 代表的なセクション
テキストセクション(.text) | 命令を配置(読込み、実行) |
RODATAセクション(.rodata) | 定数値を配置(読込み) |
データセクション(.data) | 初期化データを持つデータを配置(読込み、書き込み) |
BSSセクション(.bss) | ゼロで初期化されるデータを配置(読込み、書き込み) |
スタックセクション(.stack) | スタック空間を配置(読込み、書き込み、実行) |
オブジェクトフォーマット
- 代表的なオブジェクトフォーマット|
ELF | 主にLinux等で用いられる |
COFF | 主にSVR4等のUnixで用いられる |
ECOFF,XCOFF | 上記のCOFFの拡張 |
PE | MS-Windowsで用いられる |
OMF | インテル社が規定したオブジェクトフォーマット |
アセンブラのビルド/インストール
GNU binutils を使ってクロスアセンブラをビルドする。
- GNU binutils の最新版をゲット
- 現在ならばbinutils-2.16.1.tar.bz2をダウンロードする。
- 作業ディレクトリに展開
以下のコマンドを入力。
$ tar jxvf binutils-2.16.1.tar.bz2 $ cd binutils-2.16.1/
- binutiils-2.16.1.tar.bz2はダウンロードしたファイル。
展開するとカレントディレクトリにbinutils-2.16.1が作られる。
- configureの実行
以下のコマンドを実行する。
$ ./configure --prefix=/opt/xtool-arm-elf --target=arm-elf
- prefixオプションは、ビルドされたパッケージのインストール先ディレクトリを指示する。
- targetはビルドするターゲットアーキテクチャを指示する。今回は、arm用のクロスアセンブラを作ってみるので、arm-elfを指定する。
- ビルド
以下のコマンドを実行する。
$ make all
- インストール
以下のコマンドを実行する。
$ make install
- パスの追加
以下のコマンドを実行する。
$export PATH=/opt/xtool-arm-elf/bin:$PATH
- ログインしたら自動的にPATHを設定したい場合は、.bashrcに上記のexportコマンドを追加する。
- cygwin環境以外でも利用したい場合は、マイコンピュータのプロパティから環境変数でセットする
- 動作確認
以下のコマンドを実行する。
$ arm-elf-as --version
以下の内容が表示される。
GNU assembler 2.16.1 Copyright 2005 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-elf'.