08 アセンブラCASL2で関東地方の観光地巡り

この記事ではアセンブラ言語で、入力された数値によって処理を分岐させ、関東地方の有名な観光地の名称を出力するサブルーチンを作りました。

JNZなどの分岐命令では過去問でも見かけましたので、過去問に取り組む前の腕試し的に読んで頂けましたら幸いです。

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

実行して、

「1」を入力すると「YOKOHAMA(横浜)」
「2」を入力すると「SKYTREE(東京スカイツリー)」
「3」は「ONJYUKU(御宿おんじゅく・・・千葉県房総半島の外房の海辺の町)」
「4」は「ODAIBA(お台場)」

と出力されるように致しました。

場所をLOCATE、LENの後の番号はそれぞれの場所の文字数、場所2以降はL2などのラベルに分岐しております。

該当しない場合は、ラベルOTHERの所で1-4のキーの入力を促すメッセージを出力します。

コードはこちらです。

TEST START
 RPUSH

 IN LOCATE,LEN ;観光地の番号を入力する
 LD GR1,LOCATE ;GR1に入力した観光地の番号を読み込む
 CPL GR1,='1' ;GR1と番号'1'を比較
 JNZ L2 ;等しくなければL2に分岐する
 OUT LOCATE1,LEN1 ;1であれば「YOKOHAMA」と出力
 JUMP FIN ;ラベルFINに分岐

L2 CPL GR1,='2' ;ラベルL2ではGR1と'2'を比較する
 JNZ L3 ;等しくなければL3に分岐する
 OUT LOCATE2,LEN2 ;2であれば「SKYTREE」をと出力
 JUMP FIN ;ラベルFINに分岐

L3 CPL GR1,='3' ;ラベルL3ではGR1と'3'を比較する
 JNZ L4 ;等しくなければL4に分岐する
 OUT LOCATE3,LEN3 ;3であれば「ONJYUKU」と出力
 JUMP FIN ;ラベルFINに分岐

L4 CPL GR1,='4' ;ラベルL4ではGR1と'4'を比較する
 JNZ OTHER ;等しくなければOTHERに分岐する
 OUT LOCATE4,LEN4 ;4であれば「ODAIBA」と出力
 JUMP FIN ;ラベルFINに分岐

OTHER OUT NOTHING,LEN5 ;ラベルOTHERでは文字列NOTHINGと文字数LEN5で出力 

FIN  RPOP
 RET

LOCATE DS 256 ;場所の領域を確保
LEN DC 1 ;文字数1文字
LOCATE1 DC 'YOKOHAMA' ;最初の場所横浜
LEN1 DC 8 ;横浜の文字数
LOCATE2 DC 'SKYTREE' ;2番目の場所スカイツリー
LEN2 DC 7 ;スカイツリーの文字数
LOCATE3 DC 'ONJYUKU' ;3番目の場所御宿
LEN3 DC 7 ;御宿の文字数
LOCATE4 DC 'ODAIBA' ;4番目の場所お台場
LEN4 DC 6 ;お台場の文字数
NOTHING DC 'PREASE ENTER 1-4' ;1から4までを入力するようにメッセージ
LEN5 DC 16 ;その他の場合の文字数


 END

シミュレーターを動かして見ます。
インプットボックスで「1」と入力します。

このシミュレーターでは入力するとコンソールに表示されます。

‘1’、文字コード「0031」がGR1に入ります。
※ 1の文字コードは「0001」ではなく「0031」です。
文字コードについてはこちらの外部記事が分かりやすいです。

CPLでGR1が’1’と等しいか比較します。
等しいのでZE(ゼロフラグ)が立ちました。

JNZで等しくない場合はラベルL2に分岐します。
今回は等しいので分岐はせずに進みます。

OUT命令で、YOKOHAMAが出力されました。

その後FINラベルに分岐してプログラムが終了しました。

同様に、2,3,4も入出力して見ます。

では、次は1-4以外の、例えば’8’などを入力してその動きをトレース致します。

GR1に文字コード「0038」が入りました。

GR1は’1’と等しくないのでラベルL2に分岐します。

GR1は’2’とも等しくないのでL3に分岐します。

GR1は’3’とも等しくないのでL4に分岐します。

GR1は’4’とも等しくないので、ラベルOTHERに分岐します。

OUT命令で1-4までを入力するよう促すメッセージが出力されました。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。

横浜みなとみらいの夜景です。
ランドマークタワーから撮影しました。

スカイツリーのライトアップと河津桜です。


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

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

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

関東以外の観光地や、あなたの行ってみたい場所など、好きなようにアレンジしてみて下さい!!

TEST START
 RPUSH

;観光地の番号を入力する
;GR1に入力した観光地の番号を読み込む
;GR1と番号'1'を比較
;等しくなければL2に分岐する
;1であれば「YOKOHAMA」と出力
;ラベルFINに分岐

;ラベルL2ではGR1と'2'を比較する
;等しくなければL3に分岐する
;2であれば「SKYTREE」をと出力
;ラベルFINに分岐

;ラベルL3ではGR1と'3'を比較する
;等しくなければL4に分岐する
;3であれば「ONJYUKU」と出力
;ラベルFINに分岐

;ラベルL4ではGR1と'4'を比較する
;等しくなければOTHERに分岐する
;4であれば「ODAIBA」と出力
;ラベルFINに分岐

;ラベルOTHERでは文字列NOTHINGと文字数LEN5で出力 

FIN  RPOP
 RET

LOCATE DS 256 ;場所の領域を確保
LEN DC 1 ;文字数1文字
LOCATE1 DC 'YOKOHAMA' ;最初の場所横浜
LEN1 DC 8 ;横浜の文字数
LOCATE2 DC 'SKYTREE' ;2番目の場所スカイツリー
LEN2 DC 7 ;スカイツリーの文字数
LOCATE3 DC 'ONJYUKU' ;3番目の場所御宿
LEN3 DC 7 ;御宿の文字数
LOCATE4 DC 'ODAIBA' ;4番目の場所お台場
LEN4 DC 6 ;お台場の文字数
NOTHING DC 'PREASE ENTER 1-4' ;1から4までを入力するようにメッセージ
LEN5 DC 16 ;その他の場合の文字数


 END

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

御宿海岸と

お台場です。

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

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

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

 

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

自己紹介


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

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


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



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

午前免除試験

午後試験のオススメ本

スコアレポート

07 アセンブラCASL2、スタックを使って「CMYK」を逆さ取り出し!

この記事ではCASL2アセンブラ言語で、スタックを利用して文字列を逆に取り出すプログラムを作りました。

取り出す文字列は、インクジェットプリンターのインクで使われる「CMYK」です。
その「CMYK」の文字の並びを逆にした、「KYMC」をスタックに積み上げて、スタックの仕組みを利用して「CMYK」にして出力します。

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

CMYKについて基本情報技術者試験(FE)を受けられる方は既にご存知だと思いますが、簡単にお話しすると、インクジェットプリンターで使われているインクです。

C(シアン)、M(マゼンタ)、Y(イエロー)、K(ブラック)のことで、もう少し詳しく知りたい方は、こちらの外部記事が分かりやすいです。

この配列BEFOREは、逆から読むとCMYKになります。
スタックと言う、イメージ的に積み木みたいな仕組みを使って、
配列BEFOREの「KYMC」を配列AFTERに「CMYK」と出力されるように格納します。

配列BEFOREのすぐ後にあるのは、目印に使う配列ENDでゼロが格納されています。

では、積み木みたいなスタックに積まれて行く様子を図にします。
スタックに積む時にはPUSH命令を使います。

文字の処理が終わったかどうかの目印に、「0(ゼロ)」を使いますので、最初に0をスタックに積みます。

スタックにはPUSH命令で、このように1文字ずつ積み上げていき、取り出す時には
POP命令を使って、一番上(最後に積み上げた文字)から順に取り出します。
取り出した文字を出力用の配列AFTERに格納します。

すると、「KYMC」が「CMYK」になって出力されます。

元の文字列「KYMC」は配列BEFORE[]に入っています。
スタックを使って出力用に格納する配列はAFTER[]です。
どちらも、GR1を使ってアドレスを指し示します。

GR2は、文字列をスタックに積んだり取り出したりする時に使います。
また、GR2は、出力用文字列に格納する時にも使います。

CMYKの文字コードはこちらになります。
‘K’…「004B」
‘Y’…「0059」
‘M’…「004D」
‘C’…「0043」

文字コードについてはこちらの外部記事が分かりやすいです。

それでは、プログラムを掲載致します。

TEST START

 RPUSH

 LAD GR2,0 ;GR2に目印の0を設定
 PUSH 0,GR2 ;スタックにGR2の値を積む
 LAD GR1,BEFORE ;GR1に配列BEFOREの先頭アドレスを設定
 OUT BEFORE,LEN ;配列BEFOREを出力

;<<スタックに積むループPUSH>>
LOOPPUSH LD GR2,0,GR1 ;GR2に配列BEFOREのGR1が指し示す文字を読み込む
 CPL GR2,=0 ;目印の0まで到達したか、GR2の文字と目印0を比較する
 JZE PREPOP ;目印0まで到達したら配列AFTERの準備でPREPOPまで分岐する
 PUSH 0,GR2 ;処理中の場合は読み込んだ文字をスタックに積む
 LAD GR1,1,GR1 ;配列BEFOREの位置を1つ先に進めるのでGR1をインクリメントする
 JUMP LOOPPUSH ;読み込みとスタックに積む処理が完了するまでLOOPPUSHを繰り返す

;配列AFTERの出力準備
PREPOP LAD GR1,AFTER ;GR1に配列AFTERのアドレスを設定

;<<スタックから取り出すループPOP>>
LOOPPOP POP GR2 ;スタックから1文字取り出してGR2に格納
 CPL GR2,=0 ;文字の取り出しが最後の目印まで到達したか確認
 JZE FIN ;等しい(取り出し処理が終了)場合はFINラベルへ
 ST GR2,0,GR1 ;処理中ならGR2で取り出した文字をGR1を使って配列AFTERに格納
 LAD GR1,1,GR1 ;配列AFTERの位置を1つ先に進めるのでGR1をインクリメントする
 JUMP LOOPPOP ;出力処理が終わるまでLOOPPOPを繰り返す


FIN OUT AFTER,LEN ;配列AFTERを出力する


 RPOP
 RET

BEFORE DC 'KYMC'
END DC 0
AFTER DS 100
LEN DC 4


 END

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

GR2に目印となる0を設定し、スタックにその0を積みます。

GR1に配列BEFOREの先頭アドレスを設定します。

OUT命令で元の文字の配列BEFOREをコンソールに出力します。

スタックにPUSHするループ、LOOPPUSHに入り、配列BEFOREの先頭文字の‘K’…「004B」をGR2に読み込みます。

GR2のKと目印の0を比較します。
等しくないのでループを続行します。

スタックに‘K’…「004B」を積みます。

配列BEFOREの位置を1つ進めるのでGR1をインクリメントします。

ループLOOPPUSHを繰り返します。

GR2に‘Y’…「0059」を読み込みます。

Yと目印の0を比較します。
等しくないのでループを続けます。

スタックに‘Y’…「0059」を積みます。

配列BEFOREを1つ先に進めるので、GR1をインクリメントします。

ループLOOPPUSHを繰り返します。

GR2にM’…「004D」を読み込みます。

Mと目印の0を比較します。
等しくないのでループを続けます。

スタックにM’…「004D」を積みます。

配列BEFOREを1つ先に進めるので、GR1をインクリメントします。

ループLOOPPUSHを繰り返します。

GR2に‘C’…「0043」を読み込みます。

Cと目印の0を比較します。

等しくないのでループを続けます。

スタックに‘C’…「0043」を積みます。

配列BEFOREを1つ先に進めるので、GR1をインクリメントします。

ループLOOPPUSHを繰り返します。

GR2に‘目印’、配列ENDの「0」を読み込みます。

GR2と目印の0を比較します。
等しいので、ゼロフラグが立ちました。

分岐命令JZEで、ループを抜けて配列AFTERの出力準備のPREPOPに分岐して、GR1に配列AFTERの先頭アドレスを設定します。

今度は取り出しループのLOOPPOPに入り、スタックから一番上に積まれた‘C’…「0043」をPOP命令で取り出します。

スタックからGR2に取り出された‘C’…「0043」と目印の0を比較します。
等しくないのでループを続けます。

GR2に取り出された‘C’…「0043」を配列AFTERに格納します。

配列AFTERを1つ先に進めるのでGR1をインクリメントします。

ループLOOPPOPに戻ります。

GR2にスタックから一番上に積まれているM’…「004D」をPOP命令で取り出します。

スタックからGR2に取り出されたM’…「004D」と目印の0を比較します。
等しくないのでループを続けます。

GR2に取り出されたM’…「004D」を配列AFTERに格納します。

配列AFTERを1つ先に進めるのでGR1をインクリメントします。

ループLOOPPOPに戻ります。

スタックから一番上に積まれている‘Y’…「0059」をPOP命令で取り出します。

スタックからGR2に取り出された‘Y’…「0059」と目印の0を比較します。
等しくないのでループを続けます。

GR2に取り出された‘Y’…「0059」を配列AFTERに格納します。

配列AFTERを1つ先に進めるのでGR1をインクリメントします。

ループLOOPPOPに戻ります。

スタックから一番上に積まれている‘K’…「004B」をPOP命令で取り出します。

スタックからGR2に取り出された‘K’…「004B」と目印の0を比較します。
等しくないのでループを続けます。

GR2に取り出された‘K’…「004B」を配列AFTERに格納します。

配列AFTERを1つ先に進めるのでGR1をインクリメントします。

ループLOOPPOPに戻ります。

スタックから最後に残った目印の「0」をPOP命令で取り出します。

スタックからGR2に取り出された0と目印の0を比較します。
等しいのでJZE命令でFINラベルに分岐します。

コンソールに配列AFTERを出力します。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。


目白庭園という日本庭園の紅葉ライトアップです。


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

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

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

このコードでも、推しがいる方はあなたの推しの名前をスタックを使って取り出してみると面白いと思います。

TEST START

 RPUSH

;GR2に目印の0を設定
;スタックにGR2の値を積む
;GR1に配列BEFOREの先頭アドレスを設定
;配列BEFOREを出力

;<<スタックに積むループPUSH>>
;GR2に配列BEFOREのGR1が指し示す文字を読み込む
;目印の0まで到達したか、GR2の文字と目印0を比較する
;目印0まで到達したら配列AFTERの準備でPREPOPまで分岐する
;処理中の場合は読み込んだ文字をスタックに積む
;配列BEFOREの位置を1つ先に進めるのでGR1をインクリメントする
;読み込みとスタックに積む処理が完了するまでLOOPPUSHを繰り返す

;配列AFTERの出力準備
;GR1に配列AFTERのアドレスを設定

;<<スタックから取り出すループPOP>>
;スタックから1文字取り出してGR2に格納
;文字の取り出しが最後の目印まで到達したか確認
;等しい(取り出し処理が終了)場合はFINラベルへ
;処理中ならGR2で取り出した文字をGR1を使って配列AFTERに格納
;配列AFTERの位置を1つ先に進めるのでGR1をインクリメントする
;出力処理が終わるまでLOOPPOPを繰り返す


;配列AFTERを出力する


 RPOP
 RET

BEFORE DC 'KYMC'
END DC 0
AFTER DS 100
LEN DC 4


 END

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

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

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

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

 

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

自己紹介


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

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


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



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

午前免除試験

午後試験のオススメ本

スコアレポート

06アセンブラCASL2、配列で合格(GOUKAKU)を出力!

この記事ではアセンブラ言語で、配列と添字についてのサンプルプログラムを掲載しております。

恐らく、基本情報技術者試験の合格を目指していらっしゃる方がこの記事を読まれていると思いますので、文字列を1文字置きに取り出して「GOUKAKU」の文字を出力するサブルーチンを作りました。


下の配列BEFOREの黄色いセルが、取り出すべき文字の「GOUKAKU」です。
1文字置きに抽出するよう、アドレスを指し示すのに使うGR1は2つずつ加算して、それに対して出力用の配列AFTERの格納用アドレスに使うGR2は1つずつインクリメントして行きます。

最後までトレースすると、この様になります。

配列は添え字が0から始まりますので、GR1とGR2に0を読み込んでいます。
GR3は、元の文字列BEFOREの文字を読み込むのに使います。

文字コードは、

‘G’…「0047」
‘O’…「004F」
‘U’…「0055」
‘K’…「004B」
‘A’…「0041」
‘K’…「004B」
‘U’…「0055」

です。
文字コードはこちらの外部サイトが分かりやすいです。

では、コードを掲載致します。

TEST START

 RPUSH
 LAD GR1,0 ;GR1に配列BEFOREの先頭の添え字0を読み込む
 LAD GR2,0 ;GR2に配列AFTERの先頭の添え字0を読み込む

;<<ここからループ>>
LOOP CPL GR2,=7 ;GR2とAFTER(GOUKAKU)の文字数7文字を比較
 JZE FIN ;等しかったらFINへ分岐
 LD GR3,BEFORE,GR1 ;GR3に配列BEFOREの文字を1つずつ読み込む
 ST GR3,AFTER,GR2 ;GR3の文字を配列AFTERに格納

 LAD GR2,1,GR2 ;AFTERのGR2をインクリメント
 

 LAD GR1,2,GR1 ;BEFOREのGR1を2つ増やす
 JUMP LOOP ;LOOPへ分岐
;<<ここまでループ>>


FIN OUT AFTER,ALEN ;配列AFTERを出力

 RPOP
 RET

BEFORE DC 'GROGUBKCAMKYU' ;配列BEFOREを用意
AFTER DS 7 ;配列AFTERに領域7つ分を確保
ALEN DC 7 ;AFTERの文字数ALENを7文字とする

 END

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

GR1に配列BEFOREの添え字0が入ります。

GR2に配列AFTERの添え字0が入ります。

ループに入ります。

GR2(現在0)と文字数の7を比較して、GR2の方が小さいのでSFにフラグが立ちます。
SF(サインフラグ)は比べて小さかった時に「1」が立ちます。
比較する際に減算を用いていて、GR2の0から7を引くとマイナスになるので、SFが立ちました。

GR2と7は等しくないので分岐せずにループを続けます。

GR3にBEFOREの最初の文字’G’(文字コード0047)が入ります。

‘G’を配列AFTERの先頭に格納します。

配列AFTERの添え字を指すGR2をインクリメントします。

配列BEFOREの添え字を指すGR1を2つ増やします。

ループの先頭にジャンプします。

GR2(現在1)とAFTERの文字数7を比較して、GR2の方が小さいので、SFが立ち、分岐をせずにループを続行します。

GR3に’O’…「004F」が読み込まれます。

配列AFTERの添え字1に’O’が格納されます。

GR2をインクリメントします。

GR1を2つ増やします。

この繰り返しで、G,Oと順番に配列AFTERを格納していき、最後の’U’…「0055」を格納する所まで進めます。

(GOUKAKUの、後ろの方の’K’…「004B」を格納した所まで進めます。)

現在シミュレーターは、配列AFTERの添え字であるGR2が6になっていて、格納された文字のGR3が’K’…「004B」となっている所まで進めました。

GR2(現在6)と7を比較して、SFが立ちましたので、ループを続行します。

GR3に’U’…「0055」が入りました。

‘U’を配列AFTERに格納します。

GR2をインクリメントします。

GR1を2つ増やします。

ループの先頭に戻ります。

GR2の現在の値7が比較する7と等しかったので、ZFが立ってFINに分岐します。

FINラベルの所のOUT命令でコンソールに出力されました。

お疲れ様でした。
ここで一旦、写真で休憩を挟みます。

お台場のレインボーブリッジです。
東京タワーがレインボーブリッジの中央より少し右側に写っています。


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

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

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

TEST START

 RPUSH
;GR1に配列BEFOREの先頭の添え字0を読み込む
;GR2に配列AFTERの先頭の添え字0を読み込む

;<<ここからループ>>
;GR2とAFTER(GOUKAKU)の文字数7文字を比較
;等しかったらFINへ分岐
;GR3に配列BEFOREの文字を1つずつ読み込む
;GR3の文字を配列AFTERに格納

;AFTERのGR2をインクリメント
 

;BEFOREのGR1を2つ増やす
;LOOPへ分岐
;<<ここまでループ>>


;配列AFTERを出力

 RPOP
 RET

BEFORE DC 'GROGUBKCAMKYU' ;配列BEFOREを用意
AFTER DS 7 ;配列AFTERに領域7つ分を確保
ALEN DC 7 ;AFTERの文字数ALENを7文字とする

 END

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

お台場レインボーブリッジと自由の女神です。

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

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

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

 

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

自己紹介


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

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


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



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

午前免除試験

午後試験のオススメ本

スコアレポート

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