強火で進め

このブログではプログラム関連の記事を中心に書いてます。

iPhoneでインラインアセンブラを使う(資料編)

iPhoneインラインアセンブラ(C言語の途中にアセンブラの記述を埋め込んだもの)について調べて最近になってやっと画像のグレースケール化のプログラムの作成に成功しました。

当初はマニアックすぎて需要が無いだろうと思ってエントリーを書く予定は無かったんですが意外と要望が有ったので書いときます。

ちょっと量が多いので「資料編」「プログラム編」に分けて記載する事にします。とりあえず、「資料編」から始めます。

iPhoneではPCで有名なIntelのCPUではなく、組み込みで有名なARMというCPUが搭載されています。

そのためアセンブラの資料を調べるときにはARMアセンブラ、もしくはARM CPUについて解説してある資料を探す事になります。

取りあえずの入門的、知識を身につけるためにおすすめ

シャープのZaurusでのARMアセンブラの使い方について。
日本語で丁寧な解説、シンプルなサンプルの記載が有りおすすめです。

Assembly Programming on Linux Zaurus
http://www.mztn.org/slasm/arm00.html

インラインアセンブラの記述ルールについての解説。英語ですが記述ルールについてシンプルにまとまっていて見やすいです。

ARM GCC Inline Assembler Cookbook
http://www.ethernut.de/en/documents/arm-inline-asm.html

iPhoneでのインラインアセンブラの使い方について解説がしてあります。英語ですがiPhone向けの解説はほとんどみかけないのでかなり貴重です。

Sketchbook
http://aleiby.blogspot.com/

インラインアセンブラの記述ルールについての解説。Intel CPUに対しての解説なので当てはまらない記述もいくつか有りますが主な記述はARMに対しても同様に使用できます。

GCC Inline Assembler
http://caspar.hazymoon.jp/OpenBSD/annex/gcc_inline_asm.html

GCC-インラインアセンブリ-HOWTO (日本語訳)
http://yashiromann.sakura.ne.jp/memo/GCC-Inline-Assembly-HOWTO.html

なんといっても一番良いのは本家のGCCのドキュメントとなります。GCC version 3.1から導入された以下の様な記述方法についても説明が有ります。

     asm ("cmoveq %1,%2,%[result]"
          : [result] "=r"(result)
          : "r" (test), "r"(new), "[result]"(old));

Extended Asm - Using the GNU Compiler Collection (GCC)
http://gcc.gnu.org/onlinedocs/gcc-4.2.3/gcc/Extended-Asm.html#Extended-Asm

一通り理解できた後に

こちらにARM CPUの設計を行っているARM社が提供しているオンラインドキュメントがあります。情報が多すぎるぐらいたっぷりあります。

多少、バージョンが古いものであれば日本語訳されたものも有ります。
入門レベルのアセンブラをやるときにはそのようなものでも十分役に立つと思います。

ARM Information Center
http://infocenter.arm.com/help/index.jsp

情報が多すぎてこれじゃ、どこから手をつけて良いのかよく分からなかったため、こちらのページの

【レポート】iPhone分解レポート - 搭載チップを探る (4) カスタムパーツてんこ盛り | 携帯 | マイコミジャーナル
http://journal.mycom.co.jp/articles/2007/07/19/InsideiPhone/003.html

そこでARM 1176ベースと考えるのが自然だし、

とあるのを参考に「ARM 1176」前提で資料を見てます。

今のところ(まだ大したことやってない事もあり)資料と実際の動作が異なる様なことは無かったです。

現在、実際の作業で良く使っているは以下のページよりダウンロードできる(要、無料の会員登録)リファレンスです。
こちらの「ARMアーキテクチャリファレンスマニュアル」がARMのアセンブラコマンドが一通り網羅してあります。
Macのプレビュー表示しているときにコマンドを検索する場合、「セッションごとにグループ化」にチェックを付けて検索するのがおすすめです。

ARM:マニュアルダウンロード < ドキュメント < TOP
http://www.jp.arm.com/document/manual/mdl.cgi

その他にも「Google ソースコード検索」もかなり役に立ちます。

Google ソースコード検索
http://www.google.co.jp/codesearch

以下の様なキーワードで検索すると良いでしょう。

  • arm
  • lang:assembly
  • 使用例が調べたい命令を記述

実際に検索にかかるものの中では Linux Kernel や ffmpegソースコードインラインアセンブラアセンブラが参考になりました。

また、iPhoneに搭載されているARMが対応しているVFP(浮動小数点を並列に処理する仕組み)を使用した計算ライブラリがGoogle Codeに公開されてあり、こちらもインラインアセンブラの記述のサンプルとして参照すると良いでしょう。

vfpmathlibrary - Google Code
http://code.google.com/p/vfpmathlibrary/

書籍

書籍については自分は以下の2つを購入しました。

書店で立ち読みしたところ基本的に組み込み屋さん向けの本で回路の話や「特権モード」や「割り込み」などインラインアセンブラで使う場合にはあまり関係ない話も記述も多い、という印象でした。

しかし、ARMアセンブラの基礎が日本語で解説してあり自分には十分値段だけの価値が有るなと思い購入しました。

みなさんも一度、書店で立ち読みしてから購入を検討された方が良いかもしれません。

ARMプロセッサ入門―ARMアーキテクチャの詳細&ARM7/XScaleの応用 (TECH I)

ARMプロセッサ入門―ARMアーキテクチャの詳細&ARM7/XScaleの応用 (TECH I)

改訂 ARMプロセッサ―32ビットRISCのシステム・アーキテクチャ (Design Wave BOOKS)

改訂 ARMプロセッサ―32ビットRISCのシステム・アーキテクチャ (Design Wave BOOKS)

こちらの本も出版日が新しい事もあり気にはなってるんですが書店で見当たらなかったのでまだ検討中です。

ARM組み込みソフトウェア入門―記述例で学ぶ組み込み機器設計のためのシステム開発 (Design Wave Advanceシリーズ)

ARM組み込みソフトウェア入門―記述例で学ぶ組み込み機器設計のためのシステム開発 (Design Wave Advanceシリーズ)

あと、こっちの本は「ARMS」ってタイトルですがARM CPUファミリーの話が出てくるわけではないので気を付けて下さい。

Arms 1 (少年サンデーコミックスワイド版)

Arms 1 (少年サンデーコミックスワイド版)

って間違える人いないですよね(^_^;) こっちはこっちで面白いですけねw
まぁ、スプリガンの方がもっと好きだったりしますけど。

おすすめの資料の紹介はこんなところです。ARMアセンブラやりながら息抜きに「ARMS」読むのもオツなんじゃないでしょうか。

iPhoneインラインアセンブラを使うの記事一覧はこちら