低コスト・低消費電力のカーナビ・システムを構築するためのハード&ソフト設計 ――拡張性のあるプロセッサ・ベースの開発プラットホーム作り
● アセンブリ・コードでアルゴリズムの効率を確認する
現在の組み込みソフトウェアの多くは,特定プロセッサの拡張機能に対応したANSI-Cコードを利用して開発されています.また,CPUパワーを節約するためにアセンブリ言語を用いて最適化することがあります.この方法はある程度の労力が必要となりますが,その反面,プロセッサで実行されるアルゴリズムの効率を把握するうえで役立ちます.例として,CDブロックの復号時に使用する巡回冗長コード(CRC)検査サブモジュールのアセンブリ・コードをリスト1に示します.
リスト1はCコンパイラに合わせて記述されています.この例は,プロローグ(A)とエピローグ(E)で構成されています.スタックを介してレジスタを保存(save)および復元(restore)するという命令を使用しています.下位レジスタ(スクラッチ・レジスタ)は実行環境によって自動的に保存されます.
レジスタR0~R2には関数の引き数が格納されます.CRCアルゴリズムは特定の多項式を用いて入力ビットを除算することによって余りを算出します.実装例としては,事前に計算された参照テーブルを用いて,CRCの余りを格納したレジスタに続く八つの状態を求めます.ループの前後に八つの命令(リスト1のBとDの部分)を挿入することで,その八つの状態を求めることができます.ループ内にも同じ命令が記述されていますが,依存性を防止するために再度並べ替えて最適化しています.リスト1のCの部分で並列命令が発行されていることがわかります.これは,値の処理と読み込みの組み合わせを表しています.最終的にCRCの結果は,レジスタR0に戻り値として保存されます.