この記事では、駄菓子屋でチョコレートを買う例題を通して、「足し算とシフト」での掛け算が学べます。アセンブラの定番中の定番!!
基本情報技術者試験で頻出なので、実際の過去問のリンクも貼りました。
平成29春アセンブラ過去問
<<関連記事>>
基本情報技術者試験トップへ
アセンブラ自作サンプルへ
アセンブラ過去問プログラムへ
令和2年(令和3年1月)合格報告
2020年からの基本情報技術者試験は、
言語とアルゴリズムの配点が高くなります。
なので、プログラミング未経験の事務員の私は、
非常に焦っています。
そこで、疑似言語によるアルゴリズムを
CASL2で再現してみたら、両方学べて
一石二鳥なのではと思い、今回は「2進数の乗算」を
作ってみました。
勉強するとお腹減って、甘いものが食べたくなることもあります。
私はチョコレートが好きで、特に期間限定で、
夏だったら「塩」とか「ミント」とか入っているチョコ、
冬だったらくちどけが粉雪みたいな感じの、
ふわふわした食感のチョコが好きです。
はい、そうです、デブです。
で、2進数の乗算でイメージするチョコレートですが、
上記のようなお高いチョコは、計算が複雑になるので、
駄菓子屋で売っている5円チョコをイメージします。
5円チョコを9個買うとします。
45円ですね。
それをCASL2の2進数の乗算で計算してみたいと思います。
GR1に5円チョコの「5」・・・かけられる数「0101」
GR2に9個の「9」・・・かける数「1001」
GR3に合計0円として、0で初期化します。
フローチャートはこんな感じです。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/にしんかけかけ-1.jpg)
2進数の掛け算では、かける数(9個)の、
最後のビットが「1」だったら、合計のGR3にかけられる数(5円)を足します。
最後のビットが「0」だったら、合計のGR3は、何もしません。
その後、GR1を左シフトして、GR2を右シフトします。
これを、GR2が0になるまで繰り返します。
GR2は、
・下1桁が1かの確認
・GR1の左1ビットシフトのあとにGR2を右1ビットシフト
と、右1ビットシフトを2回もして、値が変わってしまうので、
スタックにPUSHで積んどきます。
それで、GR1、GR2、それぞれシフトする前にPOPでGR2へと値を取り出します。
では、トレースして見ます。
シミュレーターのレジスタの表示と、
スタックの表示をを2進数に切り替えます。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/1-1.png)
これはレジスタで、スタックも同じようにして切り替えます。
実行すると、まず、
GR1~GR3まで値が入りました。
GR1は5…「0101」
GR2は9…「1001」
GR3は0…「0000」
です。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/2-1.png)
GR2の最後のビットが0か1かを調べるのに、
1ビット右にシフトして、1が落っこちる、つまり、
オーバーフローするかどうかを調べます。
まず、一旦GR2の値をスタックに積みます。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/3-1.png)
右にシフトすると、OFフラグ赤くなっているので、
オーバーフローしています。
つまり、最後のビットが「1」でした。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/4-1.png)
GR3にGR1の値を加えます。
GR3は「0101」になりました。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/5.png)
スタックからGR2へ、POPで値を戻しました。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/6.png)
GR1を1ビット左へシフトします。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/7.png)
GR2を1ビット右へシフトします。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/8.png)
ループの先頭に戻ります。
また、GR2を一旦スタックへ退避させます。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/9.png)
GR2を右シフトしたら、OFが赤くなっていないので、
オーバーフローしていません。
最後のビットが0でした。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/10.png)
スタックからPOPして、値をGR2に戻します。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/11.png)
GR1を1ビット左へシフトしました。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/12.png)
GR2を1ビット右へシフトしました。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/13.png)
ループの先頭に戻ります。
また、一旦GR2をスタックへ積みました。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/14.png)
GR2の値を右に1ビットシフトしたら、
OFが赤くなっていないので、オーバーフローしていない、
つまり最後のビットが「0」でした。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/15.png)
スタックからGR2へPOPで戻します。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/16.png)
GR1を左へ1ビットシフトします。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/17.png)
GR2を右へ1ビットシフトします。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/18.png)
ループの先頭に戻ります。
また、GR2をスタックに退避させます。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/19.png)
GR2を右シフトして、最後のビットを調べると、
OFが赤くなっているので、最後のビットは「1」でした。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/20.png)
なので、GR1の値をGR3に足します。
この値が、101101で、2の5乗の【32】と、
2の3乗の【8】と、2の2乗の【4】と、2の0乗の【1】を足した、
45で、5円×9個=合計45円となります。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/21.png)
スタックからPOPで値をGR2へ戻します。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/22.png)
GR1を左へ1ビットシフトします。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/23.png)
GR2を右へ1ビットシフトします。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/24.png)
ループの先頭に戻ります。
GR2が0(ZFが赤い)となり、繰返しの条件が偽になるので、
ループを抜けます。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/25.png)
はい、駄菓子屋で、無事に5円チョコを9個買えました。
いっただっきまーす!!
だから太るんです( ;∀;)
基本情報技術者試験受かったらダイエットしようかな。
って、2018年に簿記3級受かったら、2019年に2級受かったら…って
言っていて、全然痩せる気無いかもです。
以下、プログラムになります。
![](https://nekosiestr77.xsrv.jp/wp-content/uploads/2020/07/26.png)
TEST START
RPUSH
LAD GR1,5
LAD GR2,9
LAD GR3,0
LOOP CPA GR2,=0
JZE FIN
PUSH 0,GR2
SRL GR2,1
JOV TASU
JUMP IDOU
TASU ADDL GR3,GR1
IDOU
POP GR2
SLL GR1,1
SRL GR2,1
JUMP LOOP
FIN
RPOP
RET
END
読んで下さってありがとうございました。
この記事を書くのに勉強になった本を紹介します。
多分この記事を読んで面白かったと思われた方は、きっとハマると思います。
◆アルゴリズム問題がちゃんと解ける本
アルゴリズム学習の定番。
アルゴリズムが苦手で何とかしたい方におススメ
◆アルゴリズムはじめの一歩完全攻略
実際に作って学べます。
Javaを使っています。
私はJava初めてでしたが、
それでも、ハッシュ関数の所までは、
どうにかついていけました。
もっと頑張ります。
◆速習言語CASL2
CASL2、何それ、テーマパークの絶叫マシーン
みたいな名前だね、ぐらいだった私でも、入門書として楽しく読めた本です。
◆プログラミング入門CASL2
入門が卒業出来たら、ガシガシ例題解いて、
演習問題を解いて、力を付けたいという時に
読む本です。
<<関連記事>>
基本情報技術者試験トップへ
アセンブラ自作サンプルへ
アセンブラ過去問プログラムへ
令和2年(令和3年1月)合格報告