09 アセンブラCASL2で推しのライブまでの日数をカウントダウン!!

この記事ではアセンブラ言語で、単純なループとデクリメントを通してカウントダウンの処理が学べます。

過去問でも分岐命令JPL(比較対象の数よりも大きい場合に分岐)なども出てきましたので、過去問前の腕試しに読んで頂けたら嬉しいです。

推しのライブまで後何日かといったことを求めるサブルーチンを作ってみました。

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


まず、OUT命令で「Enter your favorite name(推しの名前を入力)」と出力します。
その後、INとOUT命令で、あなたの推しの名前を入出力します。


推しのライブまでの日数を5days、4days、3days、2daysまでカウントダウンして、
その後「1-DAY!! TOMORROW」、「DAISUKI!!」と出力します。

日数が5,4,3,2,とカウントされ行き2日までは、day”s”ですよね、複数形で。
「days.」という日数の単位も含めて出力しております。

ここから、プログラムの一部である、ループの部分を抜粋をします。
GR1を日数の5から1までのループカウンタに使います。

ループに入る前に、ループカウンタGR1に5を読み込みます。

日数をDAYSに格納して出力する際、5を出力する場合は、’5’の文字コードは「0035」です。

GR2に’0’(文字コード0030)を読み込んで、GR1の5とGR2の「0030」を加算して、GR2を「0035」にすることによって出力しています。

出力の際、ST命令でDAYSに格納してOUT命令で出力しています。

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

;<<ここからループ>>

LOOP LD GR2,='0' ;GR2に'0'を読み込む
 ADDL GR2,GR1 ;出力する為、文字コード'0'(0030)が入っているGR2にGR1を加算
 ST GR2,DAYS ;ST命令でGR2の日数をDAYSに格納する
 OUT DAYS,LEND ;OUT命令でDAYSに入っている日数を出力
 SUBL GR1,=1 ;GR1をデクリメント
 CPL GR1,=1 ;GR1の値と1を比較 ココ注目!!
 JPL LOOP ;GR1が1より大きい間はループを繰り返す ココ注目!!

;<<ループここまで>>

上記のコードの抜粋部分の下から2つ目と1番下の、ココ注目!! と書いてある箇所をご覧下さい。

日数5、4、3、2までは、日数(GR1)>1ですよね。

そこで、CPL命令を使ってGR1のカウンタの値と1を比較し、ライブまでの日数>1、つまり2日まででしたら、ループを繰り返すという命令にしました。

JPLで、1と比べてPLUSでしたらLOOPへジャンプして分岐しています。

分岐命令についてはこちらの外部記事が分かりやすいです。

カウントダウンして、ライブ前日である日数が1日になったらループを抜けます。
ループを抜けた後は、「明日」の出力と、推しへの愛を込めて「DAISUKI!!」と出力します。

では、プログラム全てです。

TEST START
 RPUSH

 OUT NAME,LEN ;OUT命令で「Enter your favorite name(推しの名前を入力)」を出力
 IN OSHI,LENO ;IN命令で推しの名前を入力
 OUT OSHI,LENO ;入力した名前を出力

 LAD GR1,5 ;GR1に5を読み込む(GR1をループカウンタに使用)

;<<ここからループ>>

LOOP LD GR2,='0' ;GR2に'0'を読み込む
 ADDL GR2,GR1 ;出力する為、文字コード'0'(0030)が入っているGR2にGR1を加算
 ST GR2,DAYS ;ST命令でGR2の日数をDAYSに格納する
 OUT DAYS,LEND ;OUT命令でDAYSに入っている日数を出力
 SUBL GR1,=1 ;GR1をデクリメント
 CPL GR1,=1 ;GR1の値と1を比較
 JPL LOOP ;GR1が1より大きい間はループを繰り返す

;<<ループここまで>>

 OUT DAY1,LEND1 ;OUT命令であと1日と出力
 OUT MSG,LENM ;OUT命令で推しに「DAISUKI!!」と出力


 RPOP
 RET

NAME DC 'Enter your favorite name!';文字列「Enter your favorite name!」
LEN DC 25 ;その文字数
OSHI DS 256 ;推しの名前の領域を確保
LENO DS 256 ;推しの名前の文字数の領域を確保
DAYS DS 1 ;日数の領域を確保
LEND DC 7 ;日数の文字数
DAYCOUNT DC 'days.' ;出力する日数の単位
DAY1 DC '1-DAY!! TOMORROW!!' ;あと1日の文字列
LEND1 DC 18 ;あと1日の文字数
MSG DC 'DAISUKI!!' ;文字列「DAISUKI!!」
LENM DC 9 ;その文字数

 END

では、実際に動かしてみます。
推しの名前は「山田太郎(TARO.YAMADA)」とします。

「推しの名前を入力して下さい」と英文で出力します。

早速、「TARO.YAMADA」と入力します。

(このシミュレーターでは、入力とともにコンソールに表示されます。)

推しの名前を出力します。

GR1にループカウンタの5が入りました。

<<ここからループです。>>

GR2に文字コードの’0’である「0030」が読み込まれました。

GR2に「0030」とGR1の「0005」が加算され、「0035」になりました。

ST命令で「0035」である’5’がDAYSに格納されました。

コンソールに「あと5日」の出力をしました。

GR1をデクリメントして4が入りました。

GR1の値(現在4)と1を比較します。

1より大きいので、ループの先頭に戻ります。

———-

GR2に文字コードの’0’である「0030」が読み込まれました。

GR2に「0030」とGR1の「0004」が加算され、「0034」になりました。

ST命令で「0034」である’4’がDAYSに格納されました。

コンソールに「あと4日」の出力をしました。

GR1をデクリメントして3が入りました。

GR1の値(現在3)と1を比較します。

1より大きいので、ループの先頭に戻ります。

———-

GR2に文字コードの’0’である「0030」が読み込まれました。

GR2に「0030」とGR1の「0003」が加算され、「0033」になりました。

ST命令で「0033」である’3’がDAYSに格納されました。

コンソールに「あと3日」の出力をしました。

GR1をデクリメントして2が入りました。

GR1の値(現在2)と1を比較します。

1より大きいので、ループの先頭に戻ります。

———-

GR2に文字コードの’0’である「0030」が読み込まれました。

GR2に「0030」とGR1の「0002」が加算され、「0032」になりました。

ST命令で「0032」である’2’がDAYSに格納されました。

コンソールに「あと2日」の出力をしました。

GR1をデクリメントして1が入りました。

GR1の値(現在2)と1を比較します。

1と等しいので、ZF(ゼロフラグ)が立ちました。

<<ループはここまで>>

ループを抜けました。

「あと1日、ついに明日」と出力されました。

「大好き!!」、と出力されました。

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

日暮里駅から徒歩数分の、「夕やけだんだん」です。
東京下町の観光地、谷根千、谷中銀座付近の観光スポットです。


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

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

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

TEST START
 RPUSH

;OUT命令で「Enter your favorite name(推しの名前を入力)」を出力
;IN命令で推しの名前を入力
;入力した名前を出力

;GR1に5を読み込む(GR1をループカウンタに使用)

;<<ここからループ>>

;GR2に'0'を読み込む
;出力する為、文字コード'0'(0030)が入っているGR2にGR1を加算
;ST命令でGR2の日数をDAYSに格納する
;OUT命令でDAYSに入っている日数を出力
;GR1をデクリメント
;GR1の値と1を比較
;GR1が1より大きい間はループを繰り返す

;<<ループここまで>>

;OUT命令であと1日と出力
;OUT命令で推しに「DAISUKI!!」と出力


 RPOP
 RET

NAME DC 'Enter your favorite name!';文字列「Enter your favorite name!」
LEN DC 25 ;その文字数
OSHI DS 256 ;推しの名前の領域を確保
LENO DS 256 ;推しの名前の文字数の領域を確保
DAYS DS 1 ;日数の領域を確保
LEND DC 7 ;日数の文字数
DAYCOUNT DC 'days.' ;出力する日数の単位
DAY1 DC '1-DAY!! TOMORROW!!' ;あと1日の文字列
LEND1 DC 18 ;あと1日の文字数
MSG DC 'DAISUKI!!' ;文字列「DAISUKI!!」
LENM DC 9 ;その文字数

 END

アセンブラCASL2のおススメ本です。

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

谷根千の招き猫です。

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

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

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

 

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

自己紹介


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

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


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



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

午前免除試験

午後試験のオススメ本

スコアレポート

モバイルバージョンを終了