2016年あけましておめでとうございます。
昨年中は本を買ってもなかなか読む時間が作れなかったのですが、今年は買った本を確実に読んでいきたいと思います。
というわけで早速お正月休み中の勉強にと熱血! アセンブラ入門というアセンブラ言語の本を読みました。
12ステップで作る組込みOS自作入門の著者である坂井弘亮さんが書かれたアセンブラ本ということで坂井さんのファンである私としては読まないわけにはいきません。
といいつつ実はこの本が発売された当初、書店でこの本を手に取ってパラパラと読んでみたのですが、分厚さに圧倒されたのでとりあえずその場での購入は見送りました。
※坂井先生ごめんなさい。
それからすっかり本書のことを忘れていたのですが、先日RaspberryPi2を購入して遊んでいるうちにARMのアセンブラについて興味が出てきて、この本を思いだしました。
本書ではRISC系マイコンの代名詞であるARMについてもしっかり書かれています。実際の書籍はかなり分厚い書籍ですので私はkindleで購入しました。
よかった点
・遅延スロット
遅延スロットについては全く知識がなかったので勉強になりました。
本書でも書かれていますが、アセンブラを読んでいる際に
「ん?なんだこのnop命令は!?」
と混乱するようなnop命令が出てくることがあります。遅延スロットの存在をしらないとそのような場合に、もやもやしたままコードを読むことになりコードがスッと頭に入ってこないのですが
「ああ、こいつは遅延スロットの影響だな」
と理解した上でコードを読めればコードの内容がスッと頭に入ってきて気持ちよく読めます。
・メモリアドレッシング
メモリアドレッシングについては、「レジスタ間接」「ディプレースメント付きレジスタ間接」「インデックス付き」の各アドレッシングモードの説明が大変わかりやすかったです。
CPUのソフトウェアマニュアルにはメモリアドレッシングモードの説明が必ず載っていますが具体的な説明は少なく、一覧表のような形で書かれていることが多いです。
本書のようにアセンブラのコードを具体的に取り上げた説明があるとイメージがしやすくてとても分かりやすいですね。
・主要なCPUのアセンブラについて網羅されている
組込み系の仕事をしていると様々なCPUを扱う機会がありますが本書では本当にたくさんのCPUのアセンブラについて説明されているので、本書の読者が気になるであろうCPUについてはほぼ押さえられているのではないでしょうか。
私が気になったCPUで本書で取り上げられていたCPUは
- ARM
- i386
- SH
- H8
でした。筆者の坂井さんはPowerPCに思い入れがあるのか、PowerPCを参考にした説明が多かったような気がします。
もちろん、上記以外にも様々なアーキテクチャのCPUについて取り上げられていています。
あまり関心のないCPUのアーキテクチャについて触れられている章でも、他のCPUに通じる機能の説明が書かれていたりするので内容として幅は広いですが決して浅くはなくお腹いっぱいになれる一冊でした。
感想
全体的にアセンブラについてかなりしっかりと書かれていたのでとても勉強になる本でした。
個人的には、最近仕事でよくお目にかかる
「RXマイコンについても取り上げて欲しかった」
という思いもありますがGCCで今のところ正式にサポートされていない関係もあるためかと思います。
RXに関しては本書を参考にHEW等を使って自分でもアセンブラを出力してみて遊んで、ブログでもレポートしたいと思います。
追記
本書ではRXはとりあげられておりませんでしたが、坂井先生のサポートページで提供されている環境にはGCCのRXのクロスコンパイラは含まれているようです!(感謝)
また、GNU ToolでもRX用のコンパイラが提供されているようです。
※私は知り合いの方に教えて頂いただけでまだ試していないですが。
GNU Tools | by CyberThor Studios, Ltd.
あとはアセンブラと言えば最適化に関する話が欠かせないと思うのですが、その辺の話題が取り上げられていなかったのが少しさみしいかなと思いました。
組み込みソフト開発では、アセンブラでコードを書くことは少なく、C言語もしくはC++言語で開発することが一般的です。
RaspberryPiのようなハイスペックCPUでの「組み込みLinux」としての開発ではC/C++すら使わないケースもあります。
そういった状況に置いて開発者がアセンブラの知識を身につけていて役に立つのは何と言っても、
が発生した時です。
例えばC言語でソフトを開発していて何か不具合が発生した時に、
「C言語のソースをステップ実行してみたけど、意味不明なところにプログラムカウンタが飛んでお手上げだ!」
「ローカル変数の値が開発環境で確認できないよ・・・(涙)なんで!?」
というような状況になることがあります。
特に最適化をかけた場合顕著にこのような挙動をしますが、コンパイラによっては最適化をオプションとしてかけていなくてもコンパイラが勝手に最適化がかかったようなアセンブラが出力され、このような状態になることがあります。※具体的には、ローカル変数についてはvolatileをつけないとメモリではなくレジスタ上に割り当てを行われるとか。
開発環境上でローカル変数をそのまま見れるのとCPUのレジスタを調べて「おっ、この変数はR1レジスタに入っているな!」みたいに突き止めるのは、慣れていない人にはハードルが高い作業になります。
この様な状況でアセンブラが読めると、不具合の原因がなんなのか突き止めることができてとても役に立ちます。
上記のような現象は、アセンブラが読めると
「ああ、共通処理を先にまとめて処理するからPCがあっちこっちに飛んでいるように見えるんだな。」
「このローカル変数はレジスタに割り付けられているからデバッグ中に値が確認できないんだな」
といったことが分かります。
また、コーディングの仕方によっては、
mcommit.hatenadiary.com
に書いたようにコンパイラのレジスタの使い方で単純な分岐が意図通りに動作しないようなケースもあります。
- 作者: 坂井弘亮
- 出版社/メーカー: 秀和システム
- 発売日: 2015/06/12
- メディア: Kindle版
- この商品を含むブログを見る
追記
この本を読んで、自分でもRXのアセンブラについて調べてみたので記事を書いてみました。
mcommit.hatenadiary.com