KATUBLO
2018年11月19日

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

こんにちは。KATUOです。今回はCOMET2を用いてループプログラムを書いたのでそれに関する解説の記事を書こうと思います。

 

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が格納されることになる。

 

 

 

アセンブラ言語を学ぶ上でおすすめの参考書

 

64ビットアセンブラ入門―64ビットCPUの基本構造もやさしく解説

↑良さげな参考書。実際、大学の授業やネットで調べるよりも参考書でじっくり勉強した方が身につくと思います。将来有望な情報工学を学ぶ学生は基礎力を学生のうちに身に付けるのが大切であると思うので、リンク先の参考書を一目通して置くと良いかもしれません。

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

プロフィール

@KATUO

現在都内私立大学に通う大学4年生。大学では電気電子工学を専攻。大学2年の夏頃に、プログラマーの長期インターン募集の広告が目に止まり、独学でプログラミングの学習をスタート。この時期からプログラミングにどハマりし、現在までに「AIスタートアップ」「Webマーケティング会社」でエンジニアとしての業務に没頭してきた。

スポンサードリンク

大学生必見就活イベント