アセンブリ言語の勉強を始めたのでまとめていきます。
まだ勉強不足なので、不足している部分もあります。
もし間違っている部分あればご指摘をお願いします。
参考文献:
プログラムはなぜ動くのか
その他各種サイト
アセンブリを勉強する上での全体像を整理する
まず、プログラムを作成し、実行するまでの流れは、
1、高水準言語(C言語など)でプログラムを記述する
↓
2、プログラムをコンパイルしてマシン語のEXEファイルに変換する
↓
3、プログラムの起動時に、EXEファイルのコピーがメモリー上に作成される
↓
4、CPUが、プログラムの内容を解釈、実行する
CPUとは 〜まずはCPUを理解する〜
CPUの構成:
1、レジスタ
2、制御装置
3、演算装置
4、クロック
この中でプログラマーが意識すべきは、レジスタだけ
だそうです。(他は全く無視していいということではないと思いますが、とりあえずレジスタを理解することが重要)。
レジスタとは、処理対象となる命令やデータを格納する領域で、一種のメモリーのようなもの。
つまり、プログラムはレジスタを対象として記述される。
一旦まとめると、
流れとしては、僕らが高水準言語で作成したプログラムが、コンパイルされてマシン語になり、CPUの内部でレジスタを使った処理になるというイメージ。
マシン語が、レジスタにマシン語で命令を出すが、その命令語に英語のような略語(ニーモニック)を割り当てたものがアセンブリ言語であり、つまりマシン語とアセンブリ語は1対1で対応している。
なので、アセンブリ言語を勉強することは、プログラムが動作する仕組みを理解することの一助になる。
アセンブリ言語とは
上記で少しまとめましたが、
CPUが直接解釈・実行できるのは、ネイティブ・コード(マシン語)のみ。C言語などで書かれたコードはコンパイラでコンパイルすることでマシン語に変換される。ネイティブ・コードは数字の羅列のため理解はできない。そこで個々のネイティブ・コードに機能を表す英語の略語をつけるという手法が考案され、その略語をニーモニックと呼ぶ(例えば、mov)。
そして、そのニーモニックを使う言語をアセンブリ言語という。
アセンブリだとかアセンブラだとかアセンブルだとか聞くけど、ニュアンスとしては
アセンブリ言語を、アセンブラを使って、アセンブルするといったところか。
ニーモニックについての詳しい説明は、
e-Words ニーモニックとは
アセンブリ言語の構成
アセンブリ言語は、ネイティブコードに変換される命令(オペコード)とアセンブラ自体に対する命令である擬似命令によって構成される。
オペコードとオペランド
アセンブリ言語の構文はオペコード+オペランドで構成されます。
オペコード:命令の動作
オペランド:命令の対象となるもの
例えば、
オペコードがLAD
オペランドがA, B
の場合、
「AにBの値を格納する」という意味になる。
LAD A, B
//AにBの値を格納する
マシン語命令の主な種類
種類 | 機能 |
---|---|
データ転送命令 | レジスタとメモリー、メモリーとメモリー、レジスタと周辺装置の間でデータを読み書きする |
演算命令 | アキュムレータで算術演算、論理演算、比較演算、シフト演算を行う |
ジャンプ命令 | 条件分岐、繰り返し、無条件のジャンプを行う |
コール/リターン命令 | 関数を呼び出す/呼び出し元に戻る |