12 CASL2アセンブラで二重ループを使って階段を作ってみた。

この記事では、アセンブラ言語で1から9までの階段を作りながら、「二重ループ」と、「数値を数字に変換」を使った例を掲載しております。
インクリメントも利用して、階段を作ってみました。

この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。

過去問に取り組むまでのウォーミングアップにして頂けたら幸いです。
最初にこのサブルーチンの実行結果を表示します。

空の配列に、1を1つ、2を2つ…最後に9を9つ入れます。
1から9までの数値をGR1に設定します。

出力する配列にDANという名前を付けて、配列の先頭をGR2で指し示しました。
そのイメージです。

配列に格納する際、数値を数字にするのに「文字コード’0’」を加えています。
具体的には「1」を出力するのに、文字コードを「0031」にするので、文字コードが「0030」である’0’を加えております。
文字コードについては、こちらの記事が分かりやすいです。

文字コードを加算するのに、GR3を使いました。
1を1回、2を2回…9を9回と数字の分だけ配列に挿入する処理を繰り返す、内ループのカウンタをGR4にしました。
外ループでは、GR1で、1~9までインクリメントしています。

では、プログラミングです。

TEST START
 RPUSH
 LAD GR1,1; GR1に1を設定

LOOP1 LD GR3,GR1; 外ループ:LOOP1 文字出力用にGR3にGR1の値を読み込む
 LD GR4,GR1; 配列格納用にGR4にGR1の値を読み込む
 ADDL GR3,='0'; 数字を出力するのに文字コード’0’を加算する
 LAD GR2,DAN; 出力用の配列DANの先頭のアドレスをGR2に設定する


LOOP2 ST GR3,0,GR2 ;内ループ:LOOP2 数字を配列DANに格納する
 LAD GR4,-1,GR4 ;配列に出力する回数をデクリメント
 CPL GR4,=0 ;配列に出力する回数がゼロと等しいか
 JZE PRINTOUT ;数字を配列に格納する処理が終わったらラベルPRINTOUTに分岐する
 LAD GR2,1,GR2 ;配列の位置を次に進める
 JUMP LOOP2;内ループの先頭に分岐する 


PRINTOUT ST GR1,LEN; 配列の長さをLENに格納する
 OUT DAN,LEN; 配列を出力する
 LAD GR1,1,GR1; 次の数字を出力するのでインクリメントする
 CPL GR1,=9; 出力回数が9よりも大きいか比較
 JPL FIN; ↑の場合はFINへ分岐
 JUMP LOOP1; そうでない場合は外ループの先頭へ 


FIN RPOP
 RET

DAN DS 10;出力する配列を用意
LEN DS 1;出力する文字数

 END

では、実際にシミュレーターを動かして行きます。

外ループに入る前に、GR1に1が入りました。

<<外ループ LOOP1に入りました。>>

数値「1」を数字「’1’」に変換するのに使うGR3に1が入りました。

配列に格納する回数に使うGR4に1が入りました。

数字を出力するのに、’0’(文字コード0030)をGR3に加算されました。

出力用の配列の先頭アドレスがGR2に設定されました。
(実行環境によってアドレスは異なります。)

<<内ループ LOOP2に入りました>>

GR3の数字’1’(文字コード0031)が配列DANのGR2が指し示すアドレス(ここでは先頭アドレス)に格納されました。

配列に格納する残り回数であるGR4がデクリメントされました。

GR4の値がCPLで0と比較され、等しいのでゼロフラグが立ちました。

JZEより内ループを抜けて出力処理のラベルPRINTOUTに分岐しました。
文字数LENにGR1の値1が格納されました。

配列DANに格納された、’1’を出力しました。

次は2を出力するので、GR1がインクリメントされて2が入りました。

GR1に入っている2とCPLで9が比較され、2は9より小さいのでSFが立ちました。

<<外ループ LOOP1>>

外ループLOOP1の先頭に分岐しました。

文字コードを加算して数字に変換するのに使うGR3に2が入りました。

2を配列に格納する回数、2回を入れるGR4に2が入りました。

GR3に’0’(文字コード0030)が加算されて、0032になりました。

GR2に配列DANの先頭アドレスが設定されました。

<<内ループ LOOP2>>

GR3の数字’2’を配列DANのGR2が指し示すアドレスの所(この場合は先頭アドレス)に格納されました。

配列に格納される回数のGR4がデクリメントされました。

CPLで配列に出力される回数の残りGR4が0と等しいか比較され、この場合はGR4=1なので、分岐はしないで次に進みます。

配列のアドレスを1つ先に進めるので、GR2がインクリメントされました。

内ループの先頭に分岐します。


GR3に入った’2’が、GR2が指し示す配列のアドレス(この場合は先頭+1)の位置に格納されました。

配列に格納される回数であるGR4がデクリメントされました。

CPLでGR4の値が0と比較され、等しかったのでゼロフラグが立ち、内ループを抜け出力ラベルPRINTOUTに分岐します。


文字数ラベルLENに、GR1の値2が格納されます。

配列DANの「22」が出力されました。

次は3を出力するので、GR1がインクリメントされました。

CPLでGR1の3と9が比較され、まだ9回まで行っていないので、SFが立ちました。

外ループの先頭に行って、次は3が出力される処理になります。

あとは繰り返しなので、’9’が9回出力された直後まで進めます。
レジスタの値は、この様になっています。

GR1がインクリメントされます。

CPLでGR1が9と比較され、A(16進数の10)は9より大きいので、JPLでFINに分岐して、このサブルーチンは終わりました。

お疲れ様でした。
勉強のリフレッシュに、写真で息抜きを致します。

恵比寿ガーデンプレイス、フランスのクリスタルメーカー、バカラのシャンデリアです。

ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。

上手く動いたら、値などを好きなように変えて動かして見て下さい。

この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!

TEST START
 RPUSH
; GR1に1を設定

; 外ループ:LOOP1 文字出力用にGR3にGR1の値を読み込む
; 配列格納用にGR4にGR1の値を読み込む
; 数字を出力するのに文字コード’0’を加算する
; 出力用の配列DANの先頭のアドレスをGR2に設定する


;内ループ:LOOP2 数字を配列DANに格納する
;配列に出力する回数をデクリメント
;配列に出力する回数がゼロと等しいか
;数字を配列に格納する処理が終わったらラベルPRINTOUTに分岐する
;配列の位置を次に進める
;内ループの先頭に分岐する 


; 出力ラベルPRINTOUT 配列の長さをLENに格納する
; 配列を出力する
; 次の数字を出力するのでインクリメントする
; 出力回数が9よりも大きいか比較
; ↑の場合はFINへ分岐
; そうでない場合は外ループの先頭へ 


FIN RPOP
 RET

CASL2のおススメ本です。

皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・


恵比寿ガーデンプレイスです。

仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!

こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。

※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪

 

最後までご精読、誠にありがとうございました!!

自己紹介


アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ

アセンブラ過去問プログラムへ


プログラミング未経験者はアセンブラと表計算どっち!?



基本情報技術者試験トップへ

午前免除試験

午後試験のオススメ本

スコアレポート

モバイルバージョンを終了