アセンブラCASL2で「うるう年の判定」を作ってみた

この記事では、アセンブラ言語で「うるう年の判定」について簡単な例題で学べます。
理解の助けになるように、シンプルなフローチャートによる図解も用いております。また、アセンブラとアルゴリズムのの本の紹介もしています。

<<関連記事>>

基本情報技術者試験トップへ
アセンブラ自作サンプルへ
アセンブラ過去問プログラムへ
令和2年(令和3年1月)合格報告

2020年からの基本情報技術者試験は、言語とアルゴリズムの配点が高くなりました。
なので、プログラミング未経験の事務員の私は、非常に焦っていましたが、無事合格できました。
学習中のアウトプットを少し編集してお届けしております。

過去問平成30年秋にうるう年を含む問題が出題されました。

疑似言語によるアルゴリズムをCASL2で再現してみたら、両方学べて
一石二鳥なのではと思い、今回は「うるう年の判定」を作ってみました。

うるう年は4で割り切れる西暦年が該当して、
割り切れなかったら違うので、早速作っていきます。

これがフローチャートです。

フローチャートのデザインが、なんだか
厨二病っぽいのは、あまり気にしないで下さい。
GR1に西暦年を設定して、
GR2は計算用にします。
4で割るのは、2ビット分右シフトします。
ここでは右論理シフトを使っています。

それで、割り切れる時はオーバーフローせず、
割り切れない時はオーバーフローをします。

西暦年2019年とした時の結果は、
「CHIGAU」と表示されます。

西暦年2020年では、「URUDOSHI」と表示されます。

ここまで、プログラムは下記になります。

TEST START

RPUSH
LAD GR1,2020 ;年を設定
LD GR2,GR1
SRL GR2,2 ;2ビットシフトで4で割る
JOV CHIGAU

OUT MOJI1,LEN1 ;うるう年の場合
JUMP FIN

CHIGAU ;違う場合
OUT MOJI2,LEN2
FIN

RPOP
RET

MOJI1 DC ‘URUDOSHI’
LEN1 DC 8
MOJI2 DC ‘CHIGAU’
LEN2 DC 6

END

では、2100年では、

うるう年と、このプログラムではなるのですが、
うるう年は、4で割り切れ、且つ、100で割り切れない年です。
なので、このようにフローチャートを改変します。

CASL2で100で割れるか調べるのは、
除算は減算で行います。
例えば、19は4で割れません。
これは人間にはすぐ分かりますが、
コンピュータでは、19-4-4-4-4=3
だから、3で余る、割り切れないと判断します。
このプログラムでは、この例では、
19-4-4-4-4-4=-1と、マイナスになったら割り切れないと
判断する処理にしました。

話をうるう年の判定の例に戻すと、
西暦2100は4で割り切れても、100で割れるので、
うるう年ではありません。
なので、2100から100ずつ引いて行って、
ゼロになったらラベルCHIGAUにジャンプさせるようにします。

結果です。

プログラミングはこちらです。
ラベルLOOP100の周辺の処理に注目して下さい。

TEST START
RPUSH


LAD GR1,2100 ;年を設定
LD GR2,GR1
SRL GR2,2 ;2ビットシフトで4で割る
JOV CHIGAU

LD GR2,GR1 ;4で割り切れた年は100で割れるか
LOOP100 SUBL GR2,=100
JZE CHIGAU
JMI URU
JUMP LOOP100

URU OUT MOJI1,LEN1 ;うるう年の場合
JUMP FIN

CHIGAU ;違う場合
OUT MOJI2,LEN2
FIN

RPOP
RET

MOJI1 DC ‘URUDOSHI’
LEN1 DC 8
MOJI2 DC ‘CHIGAU’
LEN2 DC 6

END

これで、めでたしめでたし・・・・と
行きたい所ですが、
400で割り切れる年はうるう年なんです。
例えば西暦2400年はうるう年です。

さらに改変します。
フローチャートです。

西暦2400年は、4で割り切れる→うるう年の可能性あり
100で割り切れる→400で割りきれるか調べてみよう。

という訳で、西暦2400年でトレースした結果です。

プログラムです。

TEST START
RPUSH


LAD GR1,2400 ;年を設定
LD GR2,GR1
SRL GR2,2 ;2ビットシフトで4で割る
JOV CHIGAU

LD GR2,GR1 ;4で割り切れた年は100で割れるか
LOOP100 SUBL GR2,=100
JZE CHK400 ;100で割り切れたら400で割れるかチェックへ
JMI URU
JUMP LOOP100

CHK400 LD GR2,GR1 ;400で割れるかチェック
LOOP400 SUBL GR2,=400
JZE URU
JMI CHIGAU
JUMP LOOP400
URU OUT MOJI1,LEN1 ;うるう年の場合
JUMP FIN

CHIGAU ;違う場合
OUT MOJI2,LEN2
FIN

RPOP
RET

MOJI1 DC ‘URUDOSHI’
LEN1 DC 8
MOJI2 DC ‘CHIGAU’
LEN2 DC 6

END

最後に、この最終のプログラムで、
私が生れた1977年と私が社会に出た2000年は
うるう年かどうかトレースします。

1977年の結果

2000年の結果

読んで下さってありがとうございました。

この記事を書くのに勉強になった本を紹介します。
多分この記事を読んで面白かったと思われた方は、
きっとハマると思います。

◆アルゴリズム問題がちゃんと解ける本
アルゴリズム学習の定番。
アルゴリズムが苦手で何とかしたい方におススメ

◆アルゴリズムはじめの一歩完全攻略
実際に作って学べます。
Javaを使っています。
私はJava初めてでしたが、
それでも、ハッシュ関数の所までは、
どうにかついていけました。
もっと頑張ります。

◆速習言語CASL2
CASL2、何それ、テーマパークの絶叫マシーン
みたいな名前だね、ぐらいだった私でも、入門書として楽しく読めた本です。

◆プログラミング入門CASL2
入門が卒業出来たら、ガシガシ例題解いて、
演習問題を解いて、力を付けたいという時に
読む本です。

過去問平成30年秋にうるう年を含む問題が出題されました。

基本情報技術者試験トップへ
アセンブラ自作サンプルへ
アセンブラ過去問プログラムへ
これからプログラミングを始める方へ

投稿者: nekosiestr

プログラミング学習中の発達障害者です。宜しくお願いします。 趣味で写真を撮っています。 プログラミングは、GAS/HTML/CSS/JavaScript/jQuery/PHP、 発達障害は、自閉症スペクトラムASD/ADHD、 写真は、以前はコンパクトデジカメ、現在は、OLYMPUSミラーレス一眼を使っています。