この記事ではアセンブラ言語で、偶数と奇数の判別について掲載しております。
ある数を右にシフトすると、偶数の場合はオーバーフローせず、奇数だったらオーバーフローするので、分岐により出力メッセージを分けます。
オーバーフローについては、
このシフトやオーバーフローについて、後ほど具体例を用いて詳しく説明致しますが、オーバーフローって何!?と気になった方は、こちらの外部記事が分かりやすいのでオススメです。(基本情報技術者試験では勿論、ITパスポート受験の際にもお世話になったサイトです。)
さて、行動制限も無くなって東京に住んでいる私は、アセンブラで偶数でしたら北海道に、奇数でしたら沖縄に旅行したい気分です♪
そんな、旅行気分が味わえるサブルーチンを作って見ました。
この記事では、こちらのWebのシミュレーターを使っています。
ダウンロードすることなく、素早くアセンブラの勉強が出来る、私が使った中で1番便利なシミュレーターです。
具体的には、GR1に設定された数が、
偶数の場合は「HOKKAIDO」
奇数の場合は「OKINAWA」
と出力します。
偶数は英語でEVEN、奇数はODDですので、それらをラベル名に使います。
偶数の例として、10進数の「4」は、2進数で(0100)、
奇数の例として、10進数の「7」は、2進数で(0111)を挙げます。
偶数を右にシフトすると、4でしたら「0100」→「0010」になって、
右に落っこちるのは、「0100」の一番下の桁である「0」ですよね。
つまり、オーバーフローしないです。
奇数を右にシフトすると、7でしたら「0111」→「0011」になって、
右に落っこちるのは、「0111」の一番下の桁である「1」ですよね。
つまり、オーバーフローします。
オーバーフローした時のジャンプ命令「JOV」を使って、出力する文字を分岐します。
まずは、偶数の例。
TEST START
RPUSH
LAD GR1,4;←GR1に数を指定
SRL GR1,1;1ビット右へシフト
JOV OVER;オーバーフローした場合はラベルOVERへジャンプ
OUT EVEN,LEN;偶数の旅先「北海道」を出力
JUMP FIN;ラベルFINへジャンプ
OVER OUT ODD,LEN2;奇数の旅先「沖縄」を出力
FIN RPOP;終了のFINラベル
RET
EVEN DC 'HOKKAIDO';偶数ラベル
LEN DC 8;文字数
ODD DC 'OKINAWA';奇数ラベル
LEN2 DC 7;文字数
END
4行目のところで、GR1に偶数の例として「4」を設定しています。
実行すると、GR1に4が入りました。
SRLで右シフトすると、GR1が2になりました。
10進数の「4」は2進数では「0100」なので、右に1ビットシフトすると「0010」になり、右に落っこちたのは「0」なのでオーバーフローせず、OFフラグは0です。
右側のコンソールでは、「HOKKAIDO」と出力されました。
シフトについての上記の説明が分かりにくかった場合、こちらの外部記事ではYouTubeによる動画の解説もありますので、気になった方はご覧下さい。
次にGR1に、奇数である7を設定した場合の例です。
4行目のGR1の値を偶数から奇数の「7」に設定した所以外は、同じコードです。
TEST START
RPUSH
LAD GR1,7;←GR1に数を指定
SRL GR1,1;1ビット右へシフト
JOV OVER;オーバーフローした場合はラベルOVERへジャンプ
OUT EVEN,LEN;偶数の旅先「北海道」を出力
JUMP FIN;ラベルFINへジャンプ
OVER OUT ODD,LEN2;奇数の旅先「沖縄」を出力
FIN RPOP;終了のFINラベル
RET
EVEN DC 'HOKKAIDO';偶数ラベル
LEN DC 8;文字数
ODD DC 'OKINAWA';奇数ラベル
LEN2 DC 7;文字数
END
実行すると、GR1に7が入りました。
右シフトすると、GR1が3になりました。
10進数「7」は2進数「0111」で、右シフトすると「0011」になって10進数の「3」になりました。
この時に、「0111」の一番下の桁の「1」が落っこちましたので、オーバーフローのフラフOFが1になりました。
オーバーフローをしたので、7行目のJOVの分岐で、12行目のラベルOVERにジャンプしました。
右側のコンソールには、「OKINAWA」が出力されました。
お疲れ様でした。
ここで一旦、写真で休憩を挟みます。
ここは、東京都立川市と日野市の境目の立日橋付近の多摩川土手で撮影した中央線です。
多摩川土手は、ランニングされている方も結構いらっしゃいました。
ここでは、通勤で良く見る電車と、特急や貨物列車も撮れました。
(2023年GWに撮影)
ここから、復習&アウトプットタイムです!!
下記のコードをシミュレーターにコピペして、コメントを頼りに先ほどのコードを覚えているか入力して見て下さい。
上手く動いたら、値などを好きなように変えて動かして見て下さい。
この復習は学習直後は勿論、明日など少し日を開けて行うと、更に効果的です!!
TEST START
RPUSH
;←GR1に数を指定
;1ビット右へシフト
;オーバーフローした場合はラベルOVERへジャンプ
;偶数の旅先「北海道」を出力
;ラベルFINへジャンプ
;奇数の旅先「沖縄」を出力
FIN RPOP;終了のFINラベル
RET
EVEN DC 'HOKKAIDO';偶数ラベル
LEN DC 8;文字数
ODD DC 'OKINAWA';奇数ラベル
LEN2 DC 7;文字数
END
CASL2にはJOVやJUMP以外にも分岐命令があり、こちらの外部サイトがサンプル付きで分かりやすいです。
皆さま、大変お疲れ様でした。
この記事最後のブレイクタイムPhotoは・・・
多摩モノレールです。
JR立川から立川南まで徒歩で行き、柴崎体育館で下車。
日野方面に南下して撮影しました。
仕事や勉強のリフレッシュに、趣味で写真を撮っておりますので、宜しかったら フォトストック写真ACさん の投稿もご覧頂けますと、大変嬉しい限りでございます!!
こちら、無料の「ダウンロードユーザー」に登録して頂けると、無料で写真のダウンロードが可能になります。
※ 先にGoogleアカウントを作成して頂くと、登録が ラク です♪
最後までご精読、誠にありがとうございました!!
自己紹介
アセンブラ自作サンプルとFE出題範囲のアリゴリズムへ
アセンブラ過去問プログラムへ
プログラミング未経験者はアセンブラと表計算どっち!?
基本情報技術者試験トップへ
午前免除試験
午後試験のオススメ本
スコアレポート