アセンブラ言語について理解しよう Part1

以下「COMETII」という仮想のコンピュータを取り上げて説明

## アセンブラ言語とは？
#### CPUに命令を送るための、低水準言語。機械言語に近い言語。
- CPUの種類に応じて記述の仕方や文法が異なる。
- 速度が求められる場面で威力を発揮する。
- 機械言語（CPUは2進数の機械言語しか理解できない）の命令に1対1で対応させた文字列。
- コンピュータのハードウエアが動作する単位でプログラムを記述する。
- アセンブリ"assembly"は、組み立てという意味。

#### いつアセンブラ言語は必要？
- 現在ではアセンブラはめったに使われず、ほとんどのプログラマーがより効率の良い高水準言語を使っている。
- いろいろなサイトを見ても、「アセンブラは○○の開発に便利だよ」的な紹介のされ方はしていなかった。

#### ではアセンブラを勉強したほうがいい理由は？
- アセンブラさんは、機械言語にとても近い存在。
- だから勉強するとCPUやメモリなどプログラミング言語がハードウェアをどう動かしているのかよく理解できるようになり、コンピュータを見る視点がぐっと深くなる！

#### COMETIIの構成
COMETIIのハードウエアを構成する主要な装置は，3つ。


-  CPU　　コンピュータの頭脳
- メモリ　プログラム（命令とデータ）を記憶する
-  I/O　　周辺装置とコンピュータ本体を接続する

演算のプロセスは，
##### 1. メモリ内のデータを一旦CPUに読み出し，
##### 2. CPU内で演算を行い，
##### 3. その結果をメモリに書き込む。

![COMETII qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801359/1a9b8dcf-9b6d-fd94-43ed-6c39092c5449.png)


## 文法
#### 文法は1つだけ！
###命令 + 目的語
例えば、
#### `LD  GR1,A`の場合
LD => 命令　ロード（装填）しなさい！
GR1,A => GR1レジスタにA番地のデータを

## レジスタとは
##### CPU内のデータを格納する場所のこと。

COMETIIのレジスタには，
##### 1. プログラムレジスタ（PR）（プログラムカウンタとも呼ぶ）
##### 2. スタックポインタ（SP）
##### 3. フラグレジスタ（FR）
##### 4. 汎用レジスタ（GR0～GR7) <= 8つある

- レジスタのサイズはFRのみが3ビットで，他はすべて16ビットである。

![アセンブル　Qiita (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801359/af047d40-3792-59b4-d73e-efa6e97fc1fc.png)



##### アセンブラのプログラムの目的語に指定できるのは，SPとGR0～GR7だけです。

## 命令の種類( CPUにできること )

**表1●データの入出力を行う命令**

ニーモニック | 意味              | 機能             
------ | --------------- | ------------------          
LD     | LoaD            | メモリーからCPUへデータを読み込む
ST     | STore           | CPUからメモリーにデータを書き出す
LAD    | Load ADdress    | CPUのレジスタに値を設定する   
PUSH   | PUSH            | スタックにデータを書き出す     
POP    | POP             | スタックからデータを読み込む    
SVC    | SuperVisor Call | I/Oとの入出力を行う       

**表2●データの演算を行う命令**

ニーモニック | 意味              | 機能          
------ | ---------------------- | ----------------              
ADDA   | ADD Arithmetic         | 算術加算を行う         
ADDL   | ADD Logical            | 論理加算を行う         
SUBA   | SUBtract Arithmetic    | 算術減算を行う         
SUBL   | SUBtract Logical       | 論理減算を行う         
AND    | AND                    | 論理積（AND演算）を行う   
OR     | OR                     | 論理和（OR演算）を行う    
XOR    | eXclusive OR           | 排他的論理和（XOR演算）を行う
CPA    | ComPare Arithmetic     | 算術比較を行う         
CPL    | ComPare Logical        | 論理比較を行う         
SLA    | Shift Left Arithmetic  | 算術左シフトを行う       
SRA    | Shift Right Arithmetic | 算術右シフトを行う       
SLL    | Shift Left Logical     | 論理左シフトを行う       
SRL    | Shift Right Logical    | 論理右シフトを行う       
NOP    | NO Operation           | 何もしない           

**表3●プログラムの流れを制御する命令**

ニーモニック | 意味              | 機能             
------ | ---------------- | -------------------
JPL    | Jump on PLus     | 演算結果がプラスの場合に分岐する   
JMI    | Jump on MInus    | 演算結果がマイナスの場合に分岐する  
JNZ    | Jump on Non Zero | 演算結果がゼロでない場合に分岐する  
JZE    | Jump on ZEro     | 演算結果がゼロの場合に分岐する    
JOV    | Jump on OVerflow | 演算結果が桁あふれの場合に分岐する  
JUMP   | JUMP             | 無条件で分岐する           
CALL   | CALL             | 主プログラムから副プログラムを呼び出す
RET    | RETurn           | 副プログラムから主プログラムに戻る  



参考サイト
[アセンブラを学ぶ意義
矢沢 久雄 グレープシティ アドバイザリースタッフ](https://xtech.nikkei.com/atcl/learning/lecture/19/00009/00001/)
[情報処理入門 アセンブラ言語編 (全4レッスン)](https://paiza.jp/works/assembler/primer)
[アセンブリ言語の入門者が勉強すべきこと7つと参考書6選を紹介！](https://www.yume-tec.co.jp/column/series/basic-knowledge/3421)
[第1回「レジスタ」を知るとCPUの細かな処理が見えてくる](https://xtech.nikkei.com/it/article/COLUMN/20070404/267385/)