アセンブラCASL2「う◎こ」をループと条件判断で取り出す

この記事ではアセンブラ言語で、文字コードの比較により「UNKO」を取り出すことを学べます。英字と数字が混在した文字列の中から、文字コードを比較して、英字のみ取り出します。

■ 関連記事 ■

基本情報技術者試験トップへ
アセンブラ自作サンプルへ
アセンブラ過去問プログラムへ
令和2年度(令和3年1月)合格報告

2020年からの基本情報技術者試験は、言語とアルゴリズムの配点が高くなりました。
なので、プログラミング未経験の事務員の私は、非常に焦っていましたが、無事合格できました。
学習中のアウトプットを少し編集してお届けしております。

浅草にビールの泡のビル、
通称「う◎こビル」がありますよね。

写真は、スカイツリーとのコラボ。比較的地元です。
それで、文字列の中から、
「UNKO」という文字を取り出すプログラムを 作ってみました。

決して、 暇じゃないです!!

コロナで基本情報技術者試験が中止になったとは言え、
バリバリ勉強しています!!
勉強までは中止にしていないので。
自分の勉強がてらに、図解を付けてみました。

元の文字列「9U23NK6O81」の中から、
英文字である、「U,N,K,O」を取り出します。
どのようにして取り出すのかという仕組みを簡単に書くと、
英文字だったら出力、数字だったら何もしない、という命令です。
文字コードで、数字の’9’より小さいものを出さないようにします。
英文字の文字コードは、数字よりも大きいです。
その文字コードの大きさで、英文字か数字かを判断します。

元の文字列「MOTO」は、0号室、1号室…9号室まであります。
出力用の文字列「DASU」、0丁目、1丁目…3丁目まであります。

GR1は、元の文字列の先頭アドレス「0号室」を指します。
GR2は、出力用文字列の先頭アドレス「0丁目」を指します。

GR4は、GR1が指す「元の文字列MOTOの0号室の住人」の「9」さんを
ストーカーの様に見つめています。

GR3は処理した文字数が入ります。

<ここからループ>
●この作業が終わったかどうかを判断する。
上の図の通り、GR3は0で未処理なので、
処理を進めます。

●英文字に当てはまるかどうか調べる
GR4が見ている「9」さんが「0(ゼロ)」さんより小さいか
判断します。
小さくないです。
「9」さんは「9」さんと等しいかを判断します。
当てはまったので、英文字ではないことが分かります。
なので、処理、つまり、
う◎こ(UNKO)じゃないので、処理しないで、
TOBASUへ行きます。

●元の文字列を先に進める。
GR1は1号室を指します。

●処理した文字を1つ増やす。
GR3が1になります。

● ループに戻って次の文字を調べる。

<再びループへ>
●この作業が終わったかどうかを判断する。
先ほどの図のように、GR3が1なので、
まだ処理が終わっていないので、進めます。

先頭アドレスの0号室から、1つ移動して、
GR1が1号室を指し示します。
なので、今度は、GR4は、「9」さんの隣にいる、
「U」さんを、ストーカーの様に見ています。

●英文字に当てはまるかどうか調べる
GR4がストーカーの様に見ている、
「U」さんが英文字かどうか判断します。
英文字なので、出力処理をします。

●出力用文字列に格納する
GR2が指し示す、0丁目に「U」さんを
監禁します。

●元の文字列を先に進める。
GR1は2号室を指します。

●処理した文字を1つ増やす。
GR3が2になります。

● ループに戻って次の文字を調べる。

ということを繰り返して、U,N,K,Oと取り出していきます。
命令の殆どにコメントを付けましたので、
面白かったと思われた方は、トレースして見て下さい。

お疲れ様でした。
ありがとうございました。

下記がCOMET2のアセンブラCASL2による機械語命令になります。


TEST START
RPUSH

LAD GR1,MOTO ;元の文字列の先頭アドレス
LAD GR2,DASU ;出力用文字列の先頭アドレス
LAD GR3,0  ;処理した文字数

LOOP CPA GR3,MOTOLEN
JZE FIN
LD GR4,0,GR1 ;元の文字列から文字を取って来る
CPA GR4,=’0′ ;0(ゼロ)より小さいか?
JMI TOBASU ;0より小さかったらTOBASUへ
CPA GR4,=’9′ ;9と等しいか   
JMI TOBASU  ;9より大きかったらTOBASUへ 
JZE TOBASU  ;9と等しかったらTOBASUへ  
ST GR4,0,GR2 ;出力用文字列に追加
LAD GR2,1,GR2 ;出力用文字列を1つ先に進める

TOBASU LAD GR1,1,GR1 ;元の文字列を1つ先に進める
ADDA GR3,=1  ;処理した文字数をインクリメント 
JUMP LOOP
FIN OUT MOTO,MOTOLEN ;元の文字列を表示
LAD GR1,DASU ;出力用文字列の先頭アドレス
SUBL GR2,GR1 ;出力用文字列の現在のアドレス-先頭アドレス
ST GR2,DASULEN ;上で求めた文字数を出力用文字列に溜める
OUT DASU,DASULEN ;出力用の文字列を表示
RET

MOTO DC ‘9U23NK6O81’ ;元の文字列
MOTOLEN DC 10 ;元の文字列は11文字
DASU DS 20 ;出力用文字列の領域を20確保
DASULEN DS 1      ;出力用の文字数を入れる 
END

CASL2のおススメ本です。

基本情報技術者試験トップへ
アセンブラ自作サンプルへ
アセンブラ過去問プログラムへ
これからプログラミングを始める方へ