はじめに

PC Linux (i386 CPU) の Linuxでアセンブリプログラミングと同じように、 玄箱PRO やシャープのSLシリーズを使ったアセンブリプログラミングを解説します。 アセンブラは GNU binutils に入っている GNU as を使います。 binutilsのipkパッケージを用意しました。

Sharp Linux Zaurus には、ARM系のCPUであるインテル製の Intel(R) XScale(TM) を使用しています。

玄箱PRO にも Orion 88F5182 というARM系のCPUが使われています。Raspberry Piにも Broadcom BCM2835(ARM1176JZFS) というARM系のCPUが使われています。Linux Zaurus用にアセンブラで書いたプログラムは玄箱PROでも動作します。たとえば rvtl_arm はフレームバッファを使ったグラフィックを除いて玄箱PROでもそのまま使用できます。

SL-A300 PXA210 200MHz
SL-B500, SL-C700 PXA250 400MHz
玄箱PRO Orion 88F5182 400MHz

その他にも ARM系のCPUは iPhone, iPod Touch, GBA, DS などにも使われています。 開発環境が用意できればLinux のシステムコールは使えませんが、アセンブラを使ったプログラミングができます。

インテルのサイト に XScale に関するいろいろな文書が公開されていますが、ARMコアのアーキテクチャや命令セットに関する資料は 置いてないようです。アセンブリ言語でプログラミングする際に必要となる資料は、公式なリファレンスとして Arm Architecture Reference Manual を書籍として購入(約7000円)する必要があるようです。日本語版は アーム株式会社から「ARMアーキテクチャリファレンスマニュアル」 が購入(1万円)できるようです。ちなみに私は Arm Architecture Reference Manual を購入しました。

ARMプロセッサ入門—ARMアーキテクチャの詳細&ARM7/XScaleの応用 (TECH I) 」には「ARMアーキテクチャリファレンスマニュアル第2版」の日本語の pdf ファイル(786ページ)が付録CD-ROMに入っています。お買い得です。 (10/07/2003)

Webサイトで入手できる資料のうちでは、ARM Ltd.ユーザガイド にある 「ADS 1.2 Assembler Guide (2.3M PDF)」に ARM 命令セットが詳細に記載されています。 また少し古い資料ですが、1987年に出版された書籍 ARM Assembly Language ProgrammingをHTMLとPDFで公開しています。

ARM は、インテルの Pentium4 や AMD の Athron に代表される CISC (Complex Instruction Set Computer) アーキテクチャではなく、RISC (Reduced Instruction Set Computer) アーキテクチャの1つです。 RISC のCPUには他に Macintosh やゲームキューブ などで採用されている PowerPC、PlayStation、PlayStation2 で採用されている MIPS があります。 ARMも ゲームボーイアドバンスで採用されていますから、 RISC系のCPUはゲーム機向きなのでしょうか。 ちなみに初代 Xbox はPentium III系のCPUを使っています。

ARM系のCPUは、ARM Ltd.が設計したCPUをCPUメーカがライセンス生産しています。 実際のCPUの型名はメーカ毎にいろいろな名前があります。それぞれのCPUは、ARM Ltd.が設計したCPUコアの アーキテクチャバージョンで区別することになります。 Linux Zaurus が採用している XScale (PXA210、PXA250) は、v5TEというバージョンに属するCPUで、 ARM v5 + Thumb v2 + Enhanced DSP という命令を実行できることを示しています。 ARMv5TEは、ARMステートとThumbステートという2種類の異なる命令体系を持っていて、 ARMステートはオリジナルの32bitのRISC命令、Thumbステートは1命令が16bitで、コンパクトなプログラムを 作成することを目的とした命令体系になっています。

ARM は RISC でありながら、個々の命令が複雑な機能を持っています。特にほとんどの命令が条件に従って実行されたり、されなかったりする条件実行の機能を持っています。条件分岐命令はどのCPUでも持っていますが、条件転送や条件加算といった命令は珍しい機能と思います。 CPUの命令を前もって解析するパイプラインにとって、分岐命令はパイプラインを乱して実行速度を低下させる原因となる命令です。ARMでは命令の条件実行と呼べるような機能をほとんどの命令が備えているため、条件分岐命令を減らすことができます。 また、多くのRISC系のCPUが採用している「遅延スロット」が無いことも特徴です。「遅延スロット」とは、分岐命令の次の命令を常に実行することで実効速度を向上させるものです。

スタックが使いやすく、比較的高機能な命令が多いため、アセンブラでプログラムしやすいCPUであると思います。短所はアドレッシングモードが複雑なこと、除算命令が無いこと、定数やアドレスをレジスタに設定する場合に 8ビット単位で行う必要があるためトリッキーな方法が必要なことです。

ARM EABI

ARM系のCPUの場合、システムコールの方法やスタックの使い方を規定した Application Binary Interface (ABI) に 2種類あり、玄箱PROのオリジナルのシステムでは EABI (E は Embeddedの略で組み込みの意) という新しいABIが使われています。 EABI に対して古い方の ABI を OABI と呼んで区別します。システムコールの呼出し方法が swi 命令にシステムコール番号を埋め込むOABIと異なり、EABIではレジスタ(r7)にシステムコール番号を設定して swi 命令を実行します。 最新の Debian (lenny) では arm の場合は OABI、armel の場合はすべて EABI 形式でコンパイルされたプログラムで構成されています。linuxカーネルをコンパイルするときEABIを指定して、OABIも使用できるように設定できます。その場合はどちらの形式のABIでも動作します。

目次