10アセンブラCASL2で「ソーシャルディスタンス」を大文字に変換

この記事ではアセンブラ言語で、「Social Distance(ソーシャルディスタンス)」の文字列を、文字コードの演算を使って、小文字から大文字に変換する処理を学べます。

また、少しでも伝わりやすくなればと思い、シンプルな図解を掲載させて頂きました。

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

ソーシャルディスタンスは、英語で書くと「Social Distance」です。
大文字と小文字が交じっておりますが、この文字列を全部大文字に変換する
サブルーチンを作りました。

イメージはこちらです。

配列MOJIがあって、緑色の所が大文字に変換した所です。
この配列は、添え字が0番目から14番目まであります。


レジスタはGR1~GR3まで使い、それぞれの役割は、

GR1が「Social Distance」が格納されている配列の先頭アドレスから最後尾のアドレスまで、処理中の文字のアドレスを指し示し、

GR2は文字数の15で、ループカウンタとして使います。

GR3は、GR1が指し示すアドレスの中身、つまり処理中の文字そのものを指します。

大文字の文字コードは、小文字の文字コードよりも20小さいです。
例えば、’A’ は「0041」で、’a’は「0061」です。

そこで、文字コードが小文字の’a’の「0061」より小さい場合は大文字として判断します。

最初の文字の ‘S’ は大文字なのでそのままです。
大文字のSの文字コードは「0053」です。

文字コードが小文字の’a’の「0061」より小さい場合は大文字として判断するので、この場合は、変換の処理を飛ばします。

‘a’以上で、’z’の「007A」以下の場合は大文字変換の対象になりますので、文字コードを20マイナスします。

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

出力結果です。

プログラムはこちらです。
少しでも「密」を避けて、早くコロナが収まりますように、という願いを込めて作ってみました。

TEST START
 RPUSH
 OUT MOJI,LEN
 LAD GR1,MOJI ;GR1にMOJIの先頭アドレスを指定
 LD GR2,LEN   ;GR2に文字数を格納
 CALL UPPER   ;大文字に変換するサブルーチンUPPERを呼び出す
 OUT MOJI,LEN
 RPOP
 RET
MOJI DC 'Social Distance'
LEN DC 15

;大文字に変換するサブルーチンUPPER
UPPER RPUSH

;<<大文字判定ループ>>
LOOP LD GR3,0,GR1  ;GR3に配列MOJIの文字を読み込む
 CPL GR3,='a'      ;その文字の文字コードを小文字の「a」と比較
 JMI SKIP          ;文字コードがaより小さかったらSKIPへ分岐
 CPL GR3,='z'      ;小文字の「z」と比較
 JPL SKIP
 SUBL GR3,=#20     ;文字コードを20引いて「小文字 → 大文字」に変換
 ST GR3,0,GR1      ;上で大文字にした文字を配列MOJIに格納
SKIP LAD GR1,1,GR1     ;配列MOJIを1つ先に進める
 SUBL GR2,=1       ;ループカウンタにしているGR2から1を引く
 JPL LOOP          ;ループカウンタがプラスであればLOOPへ

 RPOP
 RET

 END

では、実際に動かしてみます。

サブルーチンの中で、更にサブルーチンUPPER(大文字に変換するサブルーチン)を呼び出して、戻ってきたら大文字に変換した文字列を出力します。

最初のOUT命令で、元の文字列が出力されます。

GR1に、配列MOJIの先頭アドレスが入ります(実行環境によって異なります。)

GR2に、文字数15(16進数でF)が入ります。

GR3に、最初の文字の大文字のS(文字コード0053)が入ります。

小文字の’a’(文字コード0061)と比較して、小さかったのでSFのフラグが立ちました。

文字列を次に進めます。

ループカウンタをデクリメントします。

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

次の文字、小文字の’o’(文字コード006F)を読み込みます。

小文字の’z’より小さいのでフラグが立ちました。
つまり、小文字の’o’は、’a’以上’z’以下ですので、小文字だと判定され、大文字に変換する処理の対象となります。

大文字に変換するのに、文字コードを20マイナスしました。
大文字に変換した’O’ を配列に格納します。

配列を1つ先に進めます。

ループカウンタを1つデクリメントしました。

ループの先頭に戻ります。
これを、「Social Distance」の最後の文字「e」まで進めます。

「c」の処理が終わり、ループカウンタがデクリメントされ、ループの先頭に戻った所のレジスタの値です。

GR3に、最後の文字「e(文字コード65)」が入りました。

a以上z以下なので、大文字に変換対象です。
文字コードがマイナス20されました。

GR2のループカウンタがデクリメントされて、ゼロフラグが立って、ループを抜けます。

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

瀬戸内しまなみ海道の海です。
撮影したのは平成15年(2003年)で、写ルンですで撮影した写真を復刻しました。


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

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

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

TEST START
 RPUSH
 OUT MOJI,LEN
;GR1にMOJIの先頭アドレスを指定
;GR2に文字数を格納
;大文字に変換するサブルーチンUPPERを呼び出す
 OUT MOJI,LEN
 RPOP
 RET
MOJI DC 'Social Distance'
LEN DC 15

;大文字に変換するサブルーチンUPPER
UPPER RPUSH

;<<大文字判定ループ>>
;GR3に配列MOJIの文字を読み込む
;その文字の文字コードを小文字の「a」と比較
;文字コードがaより小さかったらSKIPへ分岐
;小文字の「z」と比較
;文字コードがzより大きかったらSKIPへ分岐
;文字コードを20引いて「小文字 → 大文字」に変換
;上で大文字にした文字を配列MOJIに格納
;配列MOJIを1つ先に進める
;ループカウンタにしているGR2から1を引く
;ループカウンタがプラスであればLOOPへ

 RPOP
 RET

 END

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

しまなみ海道の夕暮れです。

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

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

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

写真素材素材【写真AC】

 

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

自己紹介


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

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


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



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

午前免除試験

午後試験のオススメ本

スコアレポート