X86アセンブラ/はじめに
なぜアセンブリ言語を学ぶのか?
[編集]アセンブリ言語は、コンピュータ・プログラマのツールボックスの中でも最も古いツールの一つです。最近では、1行のアセンブラコードを見ることなくソフトウェアプロジェクト全体を書くことができます。では、なぜアセンブリ言語を学ぶのでしょうか? アセンブリ言語は、人間とコンピュータの間の最も近いコミュニケーションの形態の1つです。アセンブリ言語を使えば、プログラマはプログラム内のデータと実行の流れをほとんど人間が読める形で正確に追跡することができます。一旦プログラムがコンパイルされると、そのコードをリバースエンジニアリングで元の形に戻すことは困難(場合によってはほぼ不可能)です。そのため、16進数や2進数ではなく、コンパイルされたプログラムを確認したい場合は、アセンブリ言語で確認する必要があります。デバッガではアセンブリ言語で書かれたプログラムコードしか表示されないことが多いので、アセンブリ言語を学ぶメリットは多いにあります。
アセンブリ言語は、ブートローダや低レベルのカーネルコンポーネントなどの低レベルのタスクを実装するために、唯一ではないにしても好ましいツールでもあります。アセンブリ言語で書かれたコードは高級言語で書かれたコードよりもオーバーヘッドが少ないため、アセンブリ言語コードは他の言語で書かれた同等のプログラムよりもはるかに速く実行されることが多い。また、高級言語で書かれたコードをアセンブリ言語にコンパイルして「手で最適化」することで速度を極限まで引き出すことができる。インテルやAMDなどのハードウェアメーカーがプロセッサに新機能や新命令を追加すると、それらの機能にアクセスする唯一の方法がアセンブリ言語ルーチンであることが多い。少なくとも、主要なコンパイラベンダーがこれらの機能をサポートするようになるまでは、そのような方法しかありません。
しかし、アセンブリ言語でプログラムを開発することは、非常に時間のかかる作業です。新しいプロジェクトをアセンブリ言語で書くのは良いアイデアではないかもしれませんが、アセンブリ言語について少しでも知っておくことは価値のあることです。
この本は誰のために書かれたか?
[編集]本書は、アセンブリ言語の入門書として、また、すでにこのテーマについて知っているが、x86システム・アーキテクチャについてもう少し情報が必要だという人のための良い資料となります。また、x86アセンブリ言語のより高度な使い方についても説明しています。読者の皆様には、プログラミングの基礎知識をお持ちの方であれば、どなたでも本書をお読みいただき、ご協力いただけると幸いです。
本書はどのような構成か?
[編集]訳注:ここで説明されている構成は、翻訳元の構成であることに注意して下さい。
第1章では、x86ファミリーのチップについて説明し、基本的な命令セットを紹介します。第2章では、アセンブラごとの構文の違いを説明します。第3章では、浮動小数点演算、MMX演算、SSE演算など、利用可能な追加命令セットについて説明します。
第4章では、ブートローダの作成などの低レベルなプログラミング作業を含む、x86アセンブラの高度なトピックについて説明します。CやC++などの高水準言語では簡単に実装できない作業がたくさんあります。例えば、割り込みの有効化・無効化、プロテクトモードの有効化、制御レジスタへのアクセス、グローバルディスクリプターテーブルの作成など、すべての作業をアセンブリで処理する必要があります。また、第4章では、アセンブリ言語とC言語などの高級言語との連携についても扱う。アセンブリで関数(例えば、プロテクトモードを有効にする関数)を書いたら、その関数をより大きなCベース(あるいはC++ベース)のカーネルにインターフェースすることができます。第5章では、標準的なx86チップセットについて説明し、x86コンピュータの基本的なアーキテクチャをカバーし、一般的なハードウェアの側面を扱います。
本書の現在のレイアウトは、読者が必要とする情報を過不足なく提供できるように設計されています。あるアセンブラのアセンブリ言語を学ぼうとする読者は、第1章と第2章のうち自分のアセンブラに直接関係する章だけを読めばよい。MMX命令やSSE命令をさまざまなアルゴリズムで実装したいと考えているプログラマは、第3章を読むだけで十分です。ブートローダやカーネル、その他の低レベルのタスクを実装したいプログラマは、第4章を読めばいいでしょう。x86ハードウェア設計の詳細を知りたい方は、第5章までお読みください。