この記事では、アセンブラ言語で1から9までの階段を作りながら、「二重ループ」と、「数値を数字に変換」を使った例を掲載しております。
インクリメントも利用して、階段を作ってみました。
この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。
過去問に取り組むまでのウォーミングアップにして頂けたら幸いです。
最初にこのサブルーチンの実行結果を表示します。
空の配列に、1を1つ、2を2つ…最後に9を9つ入れます。
1から9までの数値をGR1に設定します。
出力する配列にDANという名前を付けて、配列の先頭をGR2で指し示しました。
そのイメージです。
配列に格納する際、数値を数字にするのに「文字コード’0’」を加えています。
具体的には「1」を出力するのに、文字コードを「0031」にするので、文字コードが「0030」である’0’を加えております。
文字コードについては、こちらの記事が分かりやすいです。
文字コードを加算するのに、GR3を使いました。
1を1回、2を2回…9を9回と数字の分だけ配列に挿入する処理を繰り返す、内ループのカウンタをGR4にしました。
外ループでは、GR1で、1~9までインクリメントしています。
では、プログラミングです。
TEST START
RPUSH
LAD GR1,1; GR1に1を設定
LOOP1 LD GR3,GR1; 外ループ:LOOP1 文字出力用にGR3にGR1の値を読み込む
LD GR4,GR1; 配列格納用にGR4にGR1の値を読み込む
ADDL GR3,='0'; 数字を出力するのに文字コード’0’を加算する
LAD GR2,DAN; 出力用の配列DANの先頭のアドレスをGR2に設定する
LOOP2 ST GR3,0,GR2 ;内ループ:LOOP2 数字を配列DANに格納する
LAD GR4,-1,GR4 ;配列に出力する回数をデクリメント
CPL GR4,=0 ;配列に出力する回数がゼロと等しいか
JZE PRINTOUT ;数字を配列に格納する処理が終わったらラベルPRINTOUTに分岐する
LAD GR2,1,GR2 ;配列の位置を次に進める
JUMP LOOP2;内ループの先頭に分岐する
PRINTOUT ST GR1,LEN; 配列の長さをLENに格納する
OUT DAN,LEN; 配列を出力する
LAD GR1,1,GR1; 次の数字を出力するのでインクリメントする
CPL GR1,=9; 出力回数が9よりも大きいか比較
JPL FIN; ↑の場合はFINへ分岐
JUMP LOOP1; そうでない場合は外ループの先頭へ
FIN RPOP
RET
DAN DS 10;出力する配列を用意
LEN DS 1;出力する文字数
END
では、実際にシミュレーターを動かして行きます。
外ループに入る前に、GR1に1が入りました。
<<外ループ LOOP1に入りました。>>
数値「1」を数字「’1’」に変換するのに使うGR3に1が入りました。
配列に格納する回数に使うGR4に1が入りました。
数字を出力するのに、’0’(文字コード0030)をGR3に加算されました。
出力用の配列の先頭アドレスがGR2に設定されました。
(実行環境によってアドレスは異なります。)
<<内ループ LOOP2に入りました>>
GR3の数字’1’(文字コード0031)が配列DANのGR2が指し示すアドレス(ここでは先頭アドレス)に格納されました。
配列に格納する残り回数であるGR4がデクリメントされました。
GR4の値がCPLで0と比較され、等しいのでゼロフラグが立ちました。
JZEより内ループを抜けて出力処理のラベルPRINTOUTに分岐しました。
文字数LENにGR1の値1が格納されました。
配列DANに格納された、’1’を出力しました。
次は2を出力するので、GR1がインクリメントされて2が入りました。
GR1に入っている2とCPLで9が比較され、2は9より小さいのでSFが立ちました。
<<外ループ LOOP1>>
外ループLOOP1の先頭に分岐しました。
文字コードを加算して数字に変換するのに使うGR3に2が入りました。
2を配列に格納する回数、2回を入れるGR4に2が入りました。
GR3に’0’(文字コード0030)が加算されて、0032になりました。
GR2に配列DANの先頭アドレスが設定されました。
<<内ループ LOOP2>>
GR3の数字’2’を配列DANのGR2が指し示すアドレスの所(この場合は先頭アドレス)に格納されました。
配列に格納される回数のGR4がデクリメントされました。
CPLで配列に出力される回数の残りGR4が0と等しいか比較され、この場合はGR4=1なので、分岐はしないで次に進みます。
配列のアドレスを1つ先に進めるので、GR2がインクリメントされました。
内ループの先頭に分岐します。
GR3に入った’2’が、GR2が指し示す配列のアドレス(この場合は先頭+1)の位置に格納されました。
配列に格納される回数であるGR4がデクリメントされました。
CPLでGR4の値が0と比較され、等しかったのでゼロフラグが立ち、内ループを抜け出力ラベルPRINTOUTに分岐します。
文字数ラベルLENに、GR1の値2が格納されます。
配列DANの「22」が出力されました。
次は3を出力するので、GR1がインクリメントされました。
CPLでGR1の3と9が比較され、まだ9回まで行っていないので、SFが立ちました。
外ループの先頭に行って、次は3が出力される処理になります。
あとは繰り返しなので、’9’が9回出力された直後まで進めます。
レジスタの値は、この様になっています。
GR1がインクリメントされます。
CPLでGR1が9と比較され、A(16進数の10)は9より大きいので、JPLでFINに分岐して、このサブルーチンは終わりました。
お疲れ様でした。
勉強のリフレッシュに、写真で息抜きを致します。
恵比寿ガーデンプレイス、フランスのクリスタルメーカー、バカラのシャンデリアです。
ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。
上手く動いたら、値などを好きなように変えて動かして見て下さい。
この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!
TEST START
RPUSH
; GR1に1を設定
; 外ループ:LOOP1 文字出力用にGR3にGR1の値を読み込む
; 配列格納用にGR4にGR1の値を読み込む
; 数字を出力するのに文字コード’0’を加算する
; 出力用の配列DANの先頭のアドレスをGR2に設定する
;内ループ:LOOP2 数字を配列DANに格納する
;配列に出力する回数をデクリメント
;配列に出力する回数がゼロと等しいか
;数字を配列に格納する処理が終わったらラベルPRINTOUTに分岐する
;配列の位置を次に進める
;内ループの先頭に分岐する
; 出力ラベルPRINTOUT 配列の長さをLENに格納する
; 配列を出力する
; 次の数字を出力するのでインクリメントする
; 出力回数が9よりも大きいか比較
; ↑の場合はFINへ分岐
; そうでない場合は外ループの先頭へ
FIN RPOP
RET
CASL2のおススメ本です。
皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・
恵比寿ガーデンプレイスです。
仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!
こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。
※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪
最後までご精読、誠にありがとうございました!!
自己紹介
アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ
アセンブラ過去問プログラムへ
プログラミング未経験者はアセンブラと表計算どっち!?
基本情報技術者試験トップへ
午前免除試験
午後試験のオススメ本
スコアレポート