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アカウントを作成して頂くと、登録が ラク です♪

写真素材素材【写真AC】

 

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

自己紹介


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

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


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



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

午前免除試験

午後試験のオススメ本

スコアレポート

投稿者: nekosiestr

プログラミング学習中のロスジェネ(就職氷河期世代)の発達障害者です。 宜しくお願いします。 趣味で写真を撮っています。 プログラミングは、GAS/HTML/CSS/JavaScript/jQuery/PHP、 発達障害は、自閉症スペクトラムASD/ADHD、その他双極性障害やHSP(5人に1人の繊細さん)などの生きづらさを抱えておりますが、それでも楽しく生きて行きたいです!! 写真は、以前はコンパクトデジカメ、現在は、OLYMPUSミラーレス一眼を使っています。