KATUBLO

PROFILE

プロフィール

RELATED ARTICLE

関連記事

TWITTER

ツイッター

投稿日:2018年11月19日

【アセンブリ言語】COMETIIを使ってループプログラムを書いてみた。

なぜ今回記事を書いたのか?

大学で履修した「アセンブリ言語」の中間テスト対策のための内容整理。

 

COMETIIとは?

COMET IIとは、情報処理技術者試験の問題の中で扱われる仮想的なコンピュータの名称。

↑以下のリンクより引用。

 

レジスタ構成

以下の4種類11個の16bitレジスタによって計算が実行される。

ちなみにレジスタというのはCPU内の小規模かつ高速なメモリのこと。

 

 

汎用レジスタ(GR0~GR7):データを保持する

プログラムレジスタ(PR):実行する命令のアドレスを示す

フラグレジスタ(FR):実行結果の状態を示す

スタックポインタ(SR):積立型の一時保存領域

 

そもそもCPUって何をしてる?

余談ではあるが、CPUは以下の工程をひたすらに繰り返すマシンとも言える。

 

 

命令数

36種類の命令が実行可能。

例えば、演算命令:ADDAならば

0110000010000001

といったような感じ。

 

実装してみる

あるメモリに1を加算し、3になるまで加算処理をし続ける。

 

 

↑のサイトを使うとプログラムをweb上で実行することができる。

 

表記法

STARTやLADの列:命令コード

GR0,0の列:オペランド

 

命令コードとオペランドってなに?

命令コード:実行される命令の種類(加算や比較…etc)

オペランド:命令の操作対象(レジスタやメモリアドレスや定数)

 

 

アドレスという固有スペース

まず、命令や定数などはメモリのアドレスに書き込まれる。

先ほどの命令だと以下のようになる。

 

 

フラグレジスタ(FR)の処理

CPAで3であったら処理終了。そうでなければLOOPするという処理が書かれているが、

この処理はフラグレジスタを用いる。

フラグレジスタには値によって、実行する命令があらかじめ定義されている。

 

FR:[OF, SF, ZF]

 

6種類の命令が用意されている。

 

正分岐命令:[ , 0, 0]

負分岐命令:[ , 1,  ]

零分岐命令:[ , , 1]

非零分岐命令:[ , , 0]

オーバーフロー分岐命令:[1, , ]

無条件分岐命令:[* , * , * ]

 

 

LOOP内でのFRの振る舞い

 

①3でない場合

FR:[0, 1, 0 ]

となり、次のアドレスを示すPRは

PR:0006

となり、LOOPの処理が行われる。

 

 

②3である場合

FR:[0, 0, 1 ]

となり、次のアドレスを示すPRは

PR:0006

となるが、LOOPの処理が行われる。

ZF = 1であるため、LOOPの処理が行われずプログラムが終了する。

 

結果アドレス:0000のGR0には値3が格納されることになる。

 

感想・結果

普段あまり、意識しないアドレスやメモリの話がでてくるので、

少し、プログラミングに慣れてきたエンジニア がアセンブリ言語を勉強するのもありだと思う。

おそらく、背景として、原理的な部分の理解を学生にさせるために大学側もこの授業を用意していると感じた。

最後まで読んで頂き
ありがとうございました。
SNS等でのシェアが頂ければ幸いです。