見出し画像

4章 機械語(前半)

本章では機械語によう低水準のプログラミングに終点を当てている。
機械語:対象のハードウェア上で直接実行できること
    対象のハードウェア全体を制御できること
高水準言語:汎用性や機能性に主眼を置いて基本的設計を行う。

・単語

・機械語:仕様書の形式に従い、プロセッサとレジスタを用いてメモリを操作するように設計されている
・メモリ:データや命令を保存するハードウェアデバイスのこと。
・プロセッサ(CPU):仕様に決められた基本的な命令セットを実行する。
・命令セット:算術演算と論理演算、メモリアクセル演算、制御演算 など
・レジスタ:ほどんどのプロセッサはレジスタを備えており、各レジスタはひとつの値を保存できる
・バイナリコード:処理を依頼する命令を、CPUが理解できるように2進数で表したコードのこと
・ニーモニック:プログラミングしやすくするための簡略記憶記号のこと(MOV、ADD 等)
・アセンブリ言語:低水準言語の1つ
・アセンブラ:アセンブリ言語からバイナリコードに変換するプログラム
・アドレッシングモード:要求されたメモリのワードに対して、そのアドレスを指定する
・ポインタ:アドレスを取り扱う変数
・べースアドレス:開始位置
・メモリモジュール:複数のメモリーチップを基板に実装したもの
・メモリマップドI/O:コンピュータ内でCPUと入出力機器の間で入出力を行う(メモリアクセスと同じ手法でアクセス)
・メモリアクセス空間:CPUが直接読み書きできるすべての空間(命令メモリ、データメモリ)
・命令メモリ:読み込み専用
・一般的な命令:アドレス命令(A命令)、計算命令(C命令)
・A命令(@value):
 Aレジスタに15ビットの値を設定できる
 ⇒3つの異なる用途で使用できる
   1.Aレジスタを用いて定数を代入する
   2.メモリ操作を行う(Aレジスタにアドレスを設定 ⇒ C命令でAレジスタで指定したメモリ位置のデータを操作)
   3.命令メモリの位置指定(Aレジスタに移動先のアドレスを読み込む ⇒ C命令(jump命令)で次に実行する命令の位置まで移動)
・C命令(dest=comp;jump):
 プログラミングの中心的な役割を担っている
  ※『何を計算するのか・計算結果はどこに格納するのか・次は何をするのか』の仕様が決められている
・シンボル:アセンブリプログラムにおいて次の3つの方法で用いられる
 ⇒定義済みシンボル
 - 仮想レジスタ:R0~R15までのシンボルは、RAMアドレス0~15を参照するように定義されている
 - 定義済みポインタ:SP、LCL、ARG、THISのシンボルは、RAMアドレス0~4を参照するように定義されている
 - I/Oポインタ:SCREENとKBDのシンボルは、RAMアドレスの16384(0x4000)と24576(0x6000)を参照するように定義されている
 ⇒ラベルシンボル:ユーザーが定義するシンボルで、gotoコマンドの行き先のラベルとして使う。(Xxx 形式で定義)
         ※アセンブリコードのどの場所からでも使用可能
 ⇒変数シンボル:アセンブラによって一意のメモリアドレスが与えられる(アドレス16(0x0010)から開始)
         ※定義済みシンボルとラベルシンボルに定義されてない場合、変数として扱える
・オペランド:命令を実施するための対象となる場所
・命令部:命令コード

★コマンド

・算術演算と論理演算

例)
ADD     R1, R2, R3     // R1 ← R2+R3
ADD     R1, R2, test    // R1 ← R2+test
AND     R1, R1, R2    // R1 ← R1&R2

・メモリアクセル

⇒メモリアクセスを行うコマンドは、2つのどちらかの場合に該当する
 - 算術演算と論理演算の場合
 - メモリに対して明示的に読み込み(load)や格納(store)を行う場合
  ※レジスタとメモリ間でデータを移行するように設計されている

・直接アドレッシング

⇒直接アドレスを指定するかシンボルを用いてアドレスを参照

LOAD   R1, 67     // R1 ← Memory[67]
※レジスタからメモリ (ストア)へ、 またはメモリからレジスタ (ロード) へコピー

LOAD   R1, test   // R1 ← Memory[67]
※testの参照する値がMemory[67]の場合、メモリアドレスの67番地を参照できる

・イミディエイトアドレッシング

⇒値をそのままレジスタに読み込む

LOADI   R1, 67     // R1 ← 67

・関節アドレッシング

⇒オペランド部で指定されたメモリ上のデータはインデックスのような役割を果たし、次のメモリのデータを参照する

ADD   R1, foo, j     // R1 ← foo + j
LOAD   R2, R1      // R2 ← Memory[R1]
STR   R2, x           // x ← R2
※デスティネーションレジスタの値を、オペランドに指定されたアドレスに書き込む

コマンド

・分岐命令

⇒『JMP startwhile』の無条件分岐は、目的のアドレスを指定
『JNG R1, endwhile』の条件コマンドは、ブール条件も何らかの方々で指定

startwhile:
JNG   R1, endwhile        // R1 < 0 ならばendwhileへ移動
LOADI   R3, 45
JMP   startwhile           //startwhileへ移動
endwhile:
ADD   R7, R2, R5


Next
4章 機械語(後半)

Back
1章 ブール理論
1章 ブール理論(番外編)
2章 ブール算術
3章 順序回路

・Twitter
https://twitter.com/tango3564

・Instagram
https://www.instagram.com/tango3690/