この記事ではアセンブラ言語で、単純なループとデクリメントを通してカウントダウンの処理が学べます。
過去問でも分岐命令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出題範囲のアリゴリズムへ
アセンブラ過去問プログラムへ
プログラミング未経験者はアセンブラと表計算どっち!?
基本情報技術者試験トップへ
午前免除試験
午後試験のオススメ本
スコアレポート