私の戦闘力は53万マイクロです

農夫のおっちゃんの10分の1程度の戦闘力で適当に生きる、意識低い系サラリーマンのブログ

組み込み系エンジニアにはアセンブリ言語(アセンブラ)のスキルが必要な3つの理由

f:id:ken530000:20190202081424j:plain

自動車や家電製品、工作機械などの制御システムを開発するエンジニアのことを「組み込み系エンジニア」と言います。

 

組み込み系開発でよく使用されるプログラミング言語と言えば、C言語がダントツ1位で、他にはC++やJavaなどが使われている現場もあります。

 

あと、忘れてはいけないのは「アセンブリ言語」(アセンブラ)

アセンブリ言語 - Wikipedia

アセンブリ言語(アセンブリげんご、英: assembly language)とは、コンピュータ、マイクロコントローラ、その他のプログラム可能な機器を動作させるための機械語を人間にわかりやすい形で記述する、代表的な低水準言語である。

 

アセンブリの知識やスキルが必要な開発現場はまだまだ多いので(OS、ファームウェア・ドライバ、アプリなど、担当するモジュールによっても異なるので一概には言い切れませんが)、組み込み系エンジニアを目指す人は習得しておいて損はありません。

 

本記事では、組み込み系エンジニアにアセンブリ言語のスキルが必要な理由を3つ紹介します。 

 

 

【理由その1】スタートアップ・ルーチンはアセンブリで組むことが多いため

1つ目の理由は「スタートアップ・ルーチンのコーディング」です。

 

スタートアップ・ルーチンとは、デバイスをリセット解除してプログラム起動するときに最初に実行される処理のことを言います。

 

スタートアップ・ルーチン内の処理はシステムによって異なりますが、

  • ハードウェアの初期化や自己診断
  • RAM初期化
  • スタックポインタの設定
  • C/C++のmain関数呼び出し

などの処理を記述します。

 

スタートアップ・ルーチンはアセンブリ言語でないと書けないというわけではありませんが、僕の経験上アセンブリ言語が使われることが多いです。というか、アセンブリ言語以外でスタートアップ・ルーチンを組んだ経験ありませんw

 

 

【理由その2】デバッグ環境がチープでアセンブリでしかデバッグできないことがあるため

2つ目の理由は「デバッグ」です。

 

「なんでデバッグするのにアセンブリ言語の知識が要るの?」

と思われるかもしれませんが、Windowsプログラムの開発やWebアプリの開発などに比べると、 組み込み系開発の現場ではとてもチープな開発環境・デバッグ環境を使用していることが多いのです。

 

例えば、プログラム中のある箇所にブレイクポイントを設定したいとします。マイクロソフトのVisual Studioなら、C言語ソース上の停止したい行で「F9」ボタンを押下してブレイクポイントを設定するだけですが、組み込み系開発の環境だと逆アセンブルされたアセンブリコード上でしかブレイクポイントを設定できない、ということもあります。

 

その場合、アセンブリコードを解読してブレイク箇所を探すしかありません。これがなかなか厄介で、慣れていても苦戦します。

 

 

あと、デバッグ中に設定値を変更して動作を確認したいときなど、いちいちC言語ソースを変更してコンパイルして・・・とやるのは結構手間ですよね。

 

こういうとき、アセンブリコードを読めれば

「逆アセンブルしたコード上でさくっと設定値を変更する。」

といったこともできるため、デバッグが非常に捗ります。

 

 

【理由その3】アセンブリレベルでコードを最適化することもあるため

3つ目の理由は「コード最適化」です。

 

C言語でシステムを組むと、コンパイル後にプログラマにとって「余計なアセンブリコード」が残っていたりします。 

 

通常の業務アプリとかを開発する分には少しくらい余計なコードがあったところでそんなもの誤差のようなものですが、処理速度を要求される組み込みシステムではその少しの違いが重要になってくる局面も多々あります。また、プログラマの思い通りのタイミングでハードウェアを制御できない問題が発生することもあります。

 

「コンパイラに左右されず、自分の意図通りのコードを組める」という点は、アセンブリの最大の利点の1つです。

 

 

アセンブリ言語入門にはCASLがおすすめ

ここまで読んでくれた人は、

「組み込み系エンジニアにアセンブリ言語が必要な理由はわかったけど、アセンブリなんてどうやって勉強すればいいの?」

という疑問を持っているかもしれませんね。

 

アセンブリ言語はハードウェアによって方言のような差異があるため、汎用的に学習するには情報処理技術者試験用に開発されたアセンブリ言語である「CASL」がおすすめです。 

CASL - Wikipedia

CASL(キャスル)は、情報処理技術者試験におけるプログラミング能力試験のために、CAP-Xの後継として1986年仕様策定したアセンブリ言語である 

 

 

情報処理推進機構が公式に用意しているWindows上で動作するシミュレータがありますので*1、学習効率が良いです。

 

 

*1:非公式ですが、Mac OSやLinux上で動作するシミュレータもあります