この記事ではアセンブラ言語で、「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アカウントを作成して頂くと、登録が ラク です♪
最後までご精読、誠にありがとうございました!!
自己紹介
アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ
アセンブラ過去問プログラムへ
プログラミング未経験者はアセンブラと表計算どっち!?
基本情報技術者試験トップへ
午前免除試験
午後試験のオススメ本
スコアレポート