機械語はCPUやメモリなどの基本的なハードウエア上で直接実行できるコードです。世の中にはたくさんのプログラミング言語がありますが、機械語は最も低水準な基本言語です。
本記事では、機械語について紹介していきます。
機械語とは?
機械語の命令は二進数で表記されています。なぜなら、機械(コンピュータ)は二進数しか理解できないからです。
例えば、8ビットコンピュータの1命令は8桁の2進数「10010001」のバイナリコードです。
人間にとってはただの数字の羅列のようにしか見えませんが、バイナリコードも主語、述語のようにいくつかのセクションに分かれています。
例えば、10と0100と01(2ビット+4ビット+2ビット)のように分かれています。
バイナリコードがどのような命令になるのか?は実行するハードウエアによって違うので、たくさんの機械語が存在します。
アセンブリ言語
「10010001」のようなバイナリコードを眺めてもどこが分け目なのか?どんな意味を持っているのか?を理解するのは困難です。
こめやん
そこで、二進数を16進数に変換したり、人間にも分かりやすいように記号や英語を加えた「ニーモニック」で機械語を表記します。ニーモニックはバイナリコードを英数字に置換した形をとっています。
例えば、「 10110000 01100001」という機械語の命令は前半8ビットは後半8ビットの値をレジスタに読み込むことを意味しています。
これをニーモニックで表記すると
「MOV AL、61h」となります。前半MOVは命令コード(オペコード)を意味し、61hは後半の二進数「0110001」をhexadecimal:16進数表記したもので、命令の対象(数字や場所を表す)を表すオペランドに分かれます。
例えば、「足し算 1,1(1+1)」の足し算は命令コード、1,1はオペランドとなります
このように機械語をニーモニックで表記すると人間でも分かりやすくなります。このような言語を「アセンブリ言語」「アセンブリ」と呼びます。
アセンブリを使えば、機械語よりもはるかに簡単に、直感的にプログラムが書けます。
アセンブリもハードウエアによって記述や文法が異なります。しかし、一つのアセンブリ言語を理解すると共通する部分もあるので理解が容易になります。
参考記事のタイトルとURLを入力してください” target=”_blank” rel=”nofollow”]
アセンブラ
アセンブリ言語で書かれた命令は人間にとっては理解しやすくても機械にとっては理解できないものです。
そこで、アセンブリ言語から機械語に翻訳するプログラムが必要です。
これをアセンブラといいます。
「MOV AL、61h」というアセンブリ言語のコードをアセンブラによって機械語に変換すると「 10110000 01100001」となります。
アセンブラとアセンブリはセットのようになっていて、アセンブリをアセンブラということもあります。
代表的なアセンブラとして
- The Macro Assembler AS (汎用アセンブラで多くのCPUに対応している)
- CASL2(基礎情報技術者試験で出題されるアセンブラ)
アセンブリ言語の中身
命令の種類
アセンブリ言語はコード1行が1命令になっています。
アセンブリ言語に記述される命令は
- 論理演算
- 算術演算
- データ移動
- 分岐命令
- 制御命令
などがあります。
論理演算命令
論理演算命令はANDやORなどの論理演算を行うための命令です。
例えば、「AND, R1, R2, R3」という命令はレジスタのR2とR3のANDを計算してレジスタR1に代入するという命令になります。
算術演算命令
算術演算命令は足し算などの計算命令です。
例えば、「ADD, R1, R2, R3」という命令はレジスタのR2とR3を足し算してレジスタR1に代入するという命令になります。
データ移動命令
データ移動命令はレジスタやメモリにデータを移動する命令をいいます。
レジスタとメモリはどちらもデータを保存する場所ですが、レジスタはCPUに内蔵されている記憶装置で最も高速に動作します。メモリは相対的に低速ですが大容量です。
アセンブラCASL2の命令を見てみよう!
データ移動に関してはハードウエアとレジスタとメモリに関する知識が必要です。
まずは、例としてCASL2というアセンブラに対応するCOMET2という仮想ハードウエア仕様を見ていきます。CASL2は基礎情報技術者試験で出題されているアセンブラの入門に最適なアセンブラです。
コンピュータの演算を行う箇所であるCPU(中央演算装置)はレジスタと呼ばれるメモリを内蔵していてそこにある情報を読み取って演算を行います。
COMET2のCPUには演算を行うALU(Arithmetic Logic Unit:算術論理演算装置)と4種類のレジスタがあります。
- 汎用レジスタ(GR0~GR7) [16bit]
- プログラムレジスタ PR [16bit] 実行中の命令を記憶
- スタックポインタ SP [16bit] スタック情報を記憶
- フラグレジスタ FR [3bit] 演算結果に関わる情報を記憶
汎用レジスタは演算などに利用されるレジスタです。FR以外は16ビットです。
例えばGR0には16桁分の二進数を保存できる箱があると思ってください。
一方でメモリ(主記憶装置)は0~65535番地(65536ワード)とたくさんあります。メモリの場所を表す番地は住所のようなもので「アドレス」と呼ばれます。
ワード(word)は情報量の単位で使われるところによって異なりますが、8bitをひとかたまりとして1ワード、16bitをひとかたまりとして1ワードなどと呼びます。COMET2では0~65535番地までメモリ空間がありその情報量は1ワード16bitで65536ワードあります。
書いたプログラムはメモリに存在してます。CPUはメモリからプログラムのコードを読み取って命令を実行していきます。
COMET2ではレジスタ同士かレジスタとメモリ同士でしか演算ができないので、高速だが狭いレジスタをうまく使うことがプログラム実行速度の向上に重要です。
アセンブラへの命令
アセンブラCASL2で書かれたプログラムは「START」で始まり、「END」で終わります。
この命令はプログラムの始まりと終わりをアセンブラに教えるためのものであって、CPUにとっては演算するものではないので、機械語には翻訳されません。つまりアセンブラへの指示です。
実際のコードを見て具体的なイメージを得る
命令の種類を羅列して解説しても良いですがイメージがわきにくいので、実際のコードを見てみましょう。
行数 | ラベル | 命令コード | オペランド | コメント |
1 | TEST | START | 始まり | |
2 | LD | GR1, A | GR1にラベルAのデータを格納 | |
3 | ADDA | GR1, B | GR1とラベルBのデータを足す | |
4 | ST | GR1, C | 加算結果をラベルCに格納 | |
5 | RET | OSに制御を戻す | ||
6 | A | DC | 10 | ラベルAのメモリ番地に数値10を格納 |
7 | B | DC | 5 | ラベルBのメモリ番地に数値5を格納 |
8 | C | DS | 1 | ラベルCにメモリ領域1ワード分確保 |
9 | END | 終わり |
CASL2の命令コードは上述のようになっています。
命令コードは行数、ラベル、命令コード、オペランド、コメントに分かれていますが、一行一命令です。(LD GR1, A; コメント)
まずCASL2ではプログラムはSTARTで始まり、ENDで終わります。
STARTにはラベルが必須でプログラム名などを入れます。
プログラムは1~5行目と6~8行目で機能的に分かれています。
LDはLoadの意味を持ち「メモリからレジスタにデータを読み込む」命令です。LD GR1, Aは汎用レジスタGR1にメモリ上のラベルA番地のデータを読み込むという命令になります。
メモリは0~65535番地とたくさんのアドレスがあり、それをいちいち指定するのが面倒なので、例えば101番地などをAとしてラベルしてそこのデータを読み込むといったことをします。メモリ上のどの番地が使われるかは勝手に選択してくれるので気にしなくてよいです。
ラベルAに関する命令は6行目にあります。DCはDefine Constantの略で日本語で「定数を定義」という意味です。つまり、10という定数をラベルAとして定義してメモリ上のどこかに格納するということです。したがって、GR1にはラベルAにある定数10がロードされます。
行数3番目のADDAは算術加算の命令で「ADDA GR1, B」はGR1とBを加算して、GR1に結果を格納します。
STはStoreの意味を持ち「レジスタからメモリーにデータを移動する」命令です。LDと逆ですね。ST GR1, CはレジスタGR1に保存されている加算結果をメモリのラベルC番地に保存する命令です。
A, Bは算術に使う定数扱いですが、Cは計算結果を保存するのでA,Bとは異なり「データが空」です。したがって、ラベルC用にメモリの番地を確保しておく必要があります。
8行目の命令DSはDefine Storage(領域確保)の意味で、「C DS 1」で1ワード分のメモリ領域を確保してラベルC番地とする 命令です。
これがアセンブラの外観になります。
アドレッシングモードとは?
CPUが命令を実行する時は、レジスタやメモリ等の値を参照して行います。各種オペコードとそのオペランドの値を参照する方法をアドレッシングモードといいます。
アドレッシングモードはアセンブラによって様々です。
- イミディエイトモード:オペランドに設定された値をそのまま読み込む (ロード G1, 10→G1に10を格納)
- ダイレクトモード:オペランドに指定された値をメモリアドレスとしてメモリから読み取る
- インダイレクトモード:オペランドが指定したメモリ上に格納された値をアドレスとして利用する
参考
参考 【5分で覚えるIT基礎の基礎】だれでも一度はアセンブラを学んでおこう! 第1回 | 日経クロステック(xTECH)日経クロステック(xTECH)