「アセンブリ」言語入門
「アセンブリ言語」と聞いて、「なんか難しそう」と感じる人も多いのではないでしょうか。
そのイメージ通り決して「理解しやすい」わけではないプログラム言語が「アセンブリ」です。
「そもそもアセンブリ言語が使えなくても仕事はできるし、学ぶ必要は無いんじゃ無い?」
と思っている人も多いのではないでしょうか。
実務で利用する人はごく一部かもしれませんが、どのような言語を知っておくことはとても大切です。
アセンブリ言語の基礎
アセンブリは、ソフトウェア解析やマルウェア解析など主に「システム解析業務」等で広く使われていますが、iOSアプリが開発できるXCodeというソフトウェアでも、アプリのエラーをアセンブリで表示することができるため、デバッグ作業などにも活用されています。
アセンブリは「読める」だけでもコンピュータに対する理解度が格段に違ってきます。
プログラム言語には低水準言語
- 低水準言語
- 高水準言語
に分類することができますが、「低水準言語」は、「機械語・アセンブリ言語」などのようにプロセッサに依存したプログラムとなっていて、「人間に理解しづらい」言語です。
そのため、「アセンブリ言語は非常に難しい」というイメージを持たれている方が多いのも事実。
しかし、全く理解できないのかというと、根気よく解読していけばどのような処理をしているのかを読み解くことができるようになります。
機械語と密接に関連していて、「アセンブリコードの1つが機械語の1つと対応している」というほど、コンピューターの基本命令単位レベルの制御を行うことができるようになっています。
データの保存に関しても、「レジスタ」と呼ばれるプロセッサ内の記憶装置が主な操作対象となるため、「レジスタの仕組み」についても知っておく必要があります。
レジスタ
レジスタには、
- AX(アキュームレジスタ):演算結果を保存
- BX(ベースレジスタ):アドレスのベース値を保存
- CX(カウントレジスタ):カウント回数を保存
- DX(データレジスタ):演算に用いるデータを保存
などのデータ保存用途で使うレジスタや、
- SI(ソースインデックスレジスタ):データ転送命令の一部にて、転送元アドレスを格納
- DI(ディスティネーションインデックスレジスタ):データ転送命令の一部にて、転送先アドレスを格納
- BP(ベースポインタレジスタ):現在のスタックフレームの底部アドレスを保存
- SP(スタックポインタレジスタ):現在のスタックトップアドレスを保存
- IP(インストラクションポインタレジスタ):実行するアセンブリ命令のアドレスを保存
などのアドレス保存用途で使うレジスタなどがあります。
他にもさまざまなレジスタがありますが、これらのレジスタに値を保存したり参照したりしながらプログラムを書いていくわけですが、これらのレジスタを操作するためにさまざまなアセンブリ命令文が用意されています。
命令文
アセンブリ命令文は、機械語と1対1で対応しているため、機械語とプログラムの対応がわかりやすいという特徴があります。
しかし、ハードウェアに非常に近いプログラムとなるため、プログラム自体は読みづらくわかりづらいという側面もあり、この点がアセンブリ言語を難しいと感じる理由ではないかと思います。
これから主なアセンブリ命令文についてご紹介していきたいと思います。
mov
mov命令は、オペランド間の値の移動を行いますが、移動後も移動元にはデータが残存しています。
mov op1, op2
このように記述すると、op2の値をop1に移動することができますが、op2には元の値が残っています。
lea
lea命令は、アドレス計算に用いられる命令です。
lea op1, op2
op2オペランドのアドレス値を計算後、アドレスをop1に格納します。
lea eax, [esp+0x22]
上記コードでは、lea命令によって、espの値に「0x22」を加算したアドレス値をeaxに格納します。
xchg
xchg命令は、オペランドの値を交換する命令文です。
xchg op1, op2
この命令文では、必ず片方はレジスタを指定する必要があります。
xchg rax, r16
「rax」と「r16」をxchg命令を用いて交換します。
lodsb
メモリーの内容をレジスタに読み込む命令文。
[DS(データセグメントレジスタ):SI(ソースインデックスレジスタ)]の内容を1バイト分AL(アキュームレジスタ)に読み込む。
アキュームレジスタは演算結果を保存するレジスタ。
他にも、数百に及ぶ命令が用意されており、これらの使い方を学んでいくことがアセンブリ言語を書くためには必要となってきます。
アセンブリ言語需要と今後の動向
アセンブリ言語が必要な職種は、オープン系の開発とは異なった分野で活用されていることが多く、専門性の高いことが特徴的です。
近年、ニュースなどで取りざたされることの多いのが「サイバー攻撃」ですが、これらに関連するウイルスなどを解析する職業が「セキュリティエンジニア」です。
ソフトウェアがどのような動作をしているのかを解析したり、ウイルスの活動状況を確認したりといったことが主な業務となります。
他にも。顧客企業のサーバーを外部の攻撃から守ることなど、コンピュータの多岐に渡る高度な知識が要求されます。
他にも、ハードウェア開発でアセンブラ言語が利用されています。
モバイルデバイス・カー関連デバイス・家電製品など、製品開発にプログラミングが必要なものも数多くあり、「IoT(Internet of Things)」という言葉が社会的に認知されるなど、今後もさらにこの分野でのプログラミング需要の増加が見込まれています。
アセンブリ言語は決して学びやすいプログラム言語ではありませんが、普段の開発業務でもその知識が役立てられる機会もあるかもしれないため、学んでおくことで、ご自身の開発に活かすためにもアセンブリ言語学んでみてはいかがでしょうか。