第5章
ARM7コア搭載CPUのためのGCC＆GDB環境

ARM対応クロス開発環境の構築とその使い方
本稿も第3章と同様に，CPU固有の部分に焦点を絞って解説する．ここではARMアーキテクチャについて解説した後，ARM用のスタートアップ・ルーチンやリンカ・スクリプトの書き方，ADuC7026用のGDBスタブの移植事例について解説する．
（編集部）

山際 伸一

本稿では第 3 章と同じ構成で，ターゲット CPU としてジスタについては，それぞれの使用方法が規定されていま

ARM を取り上げ，GNU ツールを使った組み込みプログラ

す．GNU ツールではこれらのレジスタの定義に加えて，Cム開発手法と，GDB によるデバッグ環境の構築方法につ言語関数の引き数と返り値のための仕様を追加しています．

いて説明していきます．

また，ARM では，いくつかのレジスタが例外ごとに重複して用意されており，それぞれの例外が発生した場合，専用のレジスタが用いられます．

1．ARM を理解する

3）命令セット
表 1 に ARM の命令セット一覧を示します．ARM には● ARM アーキテクチャ

複数のレジスタの書き込み，そして読み出しが可能な STM，ARM アーキテクチャにはいくつか種類が存在しますが，ここではもっとも基本的なコアである ARM7
TDMI について取り上げます．

R01）プロセッサ概要

ユーザ・モードで使用可能

R1

ARM はリトル・エンディアンのパイプライ

R2ン・プロセッサですが，遅延スロットを持ちまR3せん．CPU の実行モードとして ARM ステート

R4R5と Thumb ステートと呼ばれる二つのモードがR6あり，それぞれ使用される命令セットが異なり

R7ます．ARM ステートでは 32 ビット長の命令R8セットが，Thumb ステートでは 16 ビット長のR9命令セットが用いられます．BX または BLX 命令

R10を用いることで Thumb ステートと ARM ステー

R11トのそれぞれに移行することが可能です．これ

R12らの命令には CPSR レジスタの T ビットをそのオペランドのアドレス即値，またはレジスタのシステム・モード専用

R13
R14R8̲FIQ
R9̲FIQ
R10̲FIQR11̲FIQ
R12̲FIQ
R13̲FIQ
R14̲FIQ

R13̲SVC
R14̲SVC

CPSR
ユーザ・モード2）レジスタ
ARM のレジスタを図 1 に示します．汎用レDec. 2007

R14̲ABT

R13̲IRQ
R14̲IRQ

R15（RC）

内容の最下位ビットに設定することで，異なる動作モードへの移行が可能になっています．

R13̲ABTSPSR̲FIQ
FIQモードSPSR̲SVC
SVCモードSPSR̲ABT
アボート・モード

SPSR̲IRQ
IRQモード

R13̲UND
R14̲UNDSPSR̲UND
未定義モード

図 1 ARM レジスタ一覧

KEYWORD ―― ARM，ARM7TDMI，ARM モード，Thumb モード，ADuC7026，UART，ウォッチドッグ・タイマ，スタートアップ・ルートン，startup.s，リンカ・スクリプト，例外ハンドラ109

表 1 ARM 命令セット
ニモニック
AND
EOR
ORR
BIC
ADD
ADC
SUB
RSB
SBCRSC
TST
TEQ
CMP
CMN
MOV

構 文
AND{cond}{S} Rd, Rn, Op2
EOR{cond}{S} Rd, Rn, Op2
ORR{cond}{S} Rd, Rn, Op2
BIC{cond}{S} Rd, Rn, Op2
ADD{cond}{S} Rd, Rn, Op2
ADC{cond}{S} Rd, Rn, Op2
SUB{cond}{S} Rd, Rn, Op2
RSB{cond}{S} Rd, Rn, Op2
SBC{cond}{S} Rd, Rn, Op2
RSC{cond}{S} Rd, Rn, Op2
TST{cond}
Rn, Op2
TEQ{cond}
Rn, Op2
CMP{cond}
Rn, Op2
CMN{cond}
Rd, Op2
MOV{cond}{S} Rd, Op2

意 味
論理積
排他的論理和論理和ビット・クリア
加算
キャリ付き加算減算
逆減算
キャリ付き減算
キャリ付き逆減算
テスト
等価テスト
比較
否定比較
移動

Rd ：デスティネーション・レジスタ
Rn ：第 1 ソース・レジスタ

動 作
Rd=Rn AND Op2
Rd=Rn EOR Op2
Rd=Rn OR Op2
Rd=Rn AND not（Op2）
Rd=Rn+Op2
Rd=Rn+Op2+C
Rd=Rn−Op2
Rd=Op2−Rn
Rd=Rn−Op2−not（C）
Rd=Op2−Rn−not（C）
Flag <= Rn AND Op2
Flag <= Rn EOR Op2
Flag <= Rn−Op2
Flag <= Rn+Op2
Rd=Op2<= はフラグの更新を意味する
C は条件フラグのキャリ・フラグ（a）データ処理命令

ニモニック
MUL
MLA
UMULL
UMLAL
SMULL

構 文
MUL{cond}{S} Rd,Rm,
RsMLA{cond}{S} Rd,Rm,Rs, Rn
UMULL{cond}{S}RdLo, RdHi, Rm, Rs
UMLAL{cond}{S}RdLo, RdHi, Rm, Rs
SMULL{cond}{S}RdLo, RdHi, Rm, Rs

意 味
32 ビット積算
32 ビット積和算
符号なし 64 ビット積算
符号なし 64 ビット積和算
符号あり 64 ビット積算

Rd ：デスティネーション・レジスタ
Rd/Hi ：デスティネーション・レジスタ（上位 32 ビット）Rd/Lo ：デスティネーション・レジスタ（下位 32 ビット）

動 作
Rd=（Rm ＊ Rs）［31 ： 0］
Rd=（Rm ＊ Rs+Rn）［31 ： 0］
Rd/Hi ： Rd/Lo=Rm ＊ Rs
Rd/Hi ： Rd/Lo=Rd/Hi ： Rd/Lo+Rm ＊ Rs
Rd/Hi ： Rd/Lo=Rm ＊ Rs

Rm ：被乗数レジスタ（32 ビット） Rs ：乗数レジスタ（32 ビット）
Rn ：積に加算する値（b）乗算命令

ニモニック
LDR
LDRB
LDRT
LDRBT
STR
STRB
STRT

構 文
LDR{cond}
Rd, addr_mode
LDR{cond}B
Rd, addr_mode
LDR{cond}T
Rd, addr_mode
LDR{cond}BT Rd, addr_mode
STR{cond}
Rd, addr_mode
STR{cond}B
Rd, addr_mode
STR{cond}T
Rd, addr_mode

Rd ：デスティネーション・レジスタ

意 味
ワード・ロード
バイト・ロード
ユーザ・モード，特権ワード・ロード
ユーザ・モード，特権バイト・ロード
ワード・ストア
バイト・ストア
ユーザ・モード，特権ワード・ストア
addr̲mode ：アドレッシング・モード（c）ワードおよび符号なしバイト転送命令

ニモニック
LDRH
LDRSHLDRSB

構 文
LDR{cond}H Rd, addr_mode
LDR{cond}SH Rd, addr_mode
LDR{cond}SB Rd, addr_mode

Rd ：デスティネーション・レジスタ

意 味
ハーフワード・ロード
符号付きハーフワード・ロード
符号付きバイト・ロード
addr̲mode ：アドレッシング・モード（d）ハーフワードおよび符号付きバイト転送命令

110

Dec. 2007