アセンブラCASL2で「2進数の乗算」を作ってみた

この記事では、駄菓子屋でチョコレートを買う例題を通して、「足し算とシフト」での掛け算が学べます。アセンブラの定番中の定番!!
基本情報技術者試験で頻出なので、実際の過去問のリンクも貼りました。
 平成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で初期化します。

フローチャートはこんな感じです。


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進数に切り替えます。

これはレジスタで、スタックも同じようにして切り替えます。

実行すると、まず、
GR1~GR3まで値が入りました。
GR1は5…「0101」
GR2は9…「1001」
GR3は0…「0000」
です。

GR2の最後のビットが0か1かを調べるのに、
1ビット右にシフトして、1が落っこちる、つまり、
オーバーフローするかどうかを調べます。
まず、一旦GR2の値をスタックに積みます。

右にシフトすると、OFフラグ赤くなっているので、
オーバーフローしています。
つまり、最後のビットが「1」でした。

GR3にGR1の値を加えます。
GR3は「0101」になりました。

スタックからGR2へ、POPで値を戻しました。

GR1を1ビット左へシフトします。

GR2を1ビット右へシフトします。

ループの先頭に戻ります。
また、GR2を一旦スタックへ退避させます。

GR2を右シフトしたら、OFが赤くなっていないので、
オーバーフローしていません。
最後のビットが0でした。

スタックからPOPして、値をGR2に戻します。

GR1を1ビット左へシフトしました。

GR2を1ビット右へシフトしました。

ループの先頭に戻ります。
また、一旦GR2をスタックへ積みました。

GR2の値を右に1ビットシフトしたら、
OFが赤くなっていないので、オーバーフローしていない、
つまり最後のビットが「0」でした。

スタックからGR2へPOPで戻します。

GR1を左へ1ビットシフトします。

GR2を右へ1ビットシフトします。

ループの先頭に戻ります。
また、GR2をスタックに退避させます。

GR2を右シフトして、最後のビットを調べると、
OFが赤くなっているので、最後のビットは「1」でした。

なので、GR1の値をGR3に足します。
この値が、101101で、2の5乗の【32】と、
2の3乗の【8】と、2の2乗の【4】と、2の0乗の【1】を足した、
45で、5円×9個=合計45円となります。

スタックからPOPで値をGR2へ戻します。

GR1を左へ1ビットシフトします。

GR2を右へ1ビットシフトします。

ループの先頭に戻ります。
GR2が0(ZFが赤い)となり、繰返しの条件が偽になるので、
ループを抜けます。

はい、駄菓子屋で、無事に5円チョコを9個買えました。
いっただっきまーす!!

だから太るんです( ;∀;)
基本情報技術者試験受かったらダイエットしようかな。
って、2018年に簿記3級受かったら、2019年に2級受かったら…って
言っていて、全然痩せる気無いかもです。

以下、プログラムになります。

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月)合格報告

アセンブラCASL2で「挿入法」を作ってみた

この記事では、アセンブラ言語で「挿入法」について簡単な例題で学べます。
シンプルな図解を用いています。また、アセンブラの本の紹介もしています。
挿入法について、別名「ぶち込み法」と命名しました(=^x^=)

<<関連記事>>

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

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

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

気づいたことですが、
挿入法って「ぶち込み法」だと思うと、
分かりやすいのかもしれないです。
挿入法は、既に整列済みの範囲の中に、
今見ている値を適切な位置に順々にぶち込んで行きます。

配列DATAに、「CBEAD」と入力します。
これを「ABCDE」に揃えます。
CASL2では文字コードで大小を判断して、
例えばAなら41、Bなら42…と比較して探します。

この例で行くと、
既に整列済みのCに対して、
今GR1で見ているBをぶち込みます。
この時、GR2で指す範囲は、
配列の先頭の要素0から、GR1より1つ前までです。
GR1が右に進んでいくほど、GR2の動ける範囲が
多くなります。

Bを作業領域(TEMP)のGR3に
退避します。
その後、ループのフラグを「true」にします。
フラグはGR4で示します。
配列DATAの先頭アドレス(固定)をGR5に設定します。
配列DATAの末尾のアドレス(固定)をGR6に設定します。
GR2が指す値をGR7に設定します。

CとBで、Cの方が大きいなので、
Cを1つ右にどかすイメージでコピーします。
GR2を1つ前に移動させます。
GR2が配列の先頭より前になったので、
ループを抜けます。

GR3に退避したBを、
Cがあった所にぶち込むイメージでコピーします。

最初のループ修了では、こうなりました。

これで、要素0にB、要素1にCが来て整列済みになりました。
次はEを要素2のEをぶち込む処理をします。


GR1は要素2のEを指し、GR2は、要素1~要素0の
範囲で動きます。
EはGR3に退避させます。
フラグはtrueです。

CはEより小さいので、
GR4のフラグを「False」にしてループを抜けます。

次は要素3のAを処理します。
GR3にAを退避させます。
ループのフラグをtrueにします。

要素3のAを整列済みのBCDの適切な位置にぶち込んでいきます。
EとAを比べて、Eの方が大きいので、Eを1つ後ろにどかすイメージで
コピーします。
GR2を1つ前に移動させます。

次に、AとCでは、Cの方が大きいので、Cを1後ろに
どかすイメージでコピーします。
GR2を1つ前に移動させます。

次に、AとBでは、Bの方が大きいので、Bを1後ろに
どかすイメージでコピーします。
GR2を1つ前に移動させます。

GR2が配列の先頭より前になったので、ループを抜けます。
GR3に退避したAを要素0にぶち込みます。

最後にDをぶち込む処理をします。

GR3にDを退避させます。
EとDではEの方が大きいので、
Eを右にどかすイメージでコピーします。
GR2を1つ前にします。

次に、CとDを比較します。

Cの方が小さいので、フラグをFalseにして、
ループを抜けます。

Dをぶち込むイメージでコピーします。
これで整列が完了しました。

出力結果になります。

プログラミングです。

TEST START
RPUSH


IN DATA,LEN
OUT DATA,LEN

LAD GR1,DATA
LAD GR1,1,GR1 ;挿入する要素は要素1から
LAD GR5,DATA ;先頭アドレス(固定)
LD GR6,GR5 ;末尾のアドレス(固定)
LAD GR6,4,GR6

LOOP1 CPA GR1,GR6
JPL FIN
LD GR3,0,GR1 ;挿入する要素をTEMPへ退避
LD GR2,GR1 ;整列済み領域アドレスの設定
SUBA GR2,=1
LD GR4,=’true’ ;ループフラグの設定

LOOP2 CPA GR2,GR5 ;整列済み領域と先頭アドレスの位置の比較
JMI SOUNYU
CPA GR4,=’true’
JNZ SOUNYU

LD GR7,0,GR2 ;整列済みの比較している要素の中身をGR7に設定
CPA GR7,GR3 ;整列済みの比較位置の値と退避した値の比較
JMI FFF ;整列済みの方が小さかったらフラグをfalseへジャンプ

LAD GR2,1,GR2 ;整列済みの要素の1つ後ろにどける
ST GR7,0,GR2 ;値を1つ後ろにコピー
LAD GR2,-2,GR2 ;整列済みのアドレス値を戻してひとつ前へ
JUMP LOOP2

FFF LD GR4,=’false’

SOUNYU LAD GR2,1,GR2
ST GR3,0,GR2
LAD GR1,1,GR1
JUMP LOOP1

FIN OUT DATA,LEN

RPOP
RET

DATA DS 5
LEN DC 5

END

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

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

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

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

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

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

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

アセンブラCASL2で「二分探索」を作ってみた

この記事では、アセンブラ言語で「二分探索法」について簡単な例題で学べます。
シンプルな図解を用いています。また、アセンブラとアルゴリズムのの本の紹介もしています。

<<関連記事>>

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

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

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

二分探索は整列済みの配列から、目的の値を探します。
探索対象を真ん中の値より大きいか、小さいかで、範囲を絞って見つけます。
Log2 8=3 で、配列の要素数が8だったら3回の比較、Log2 16=4 で、要素数が16だったら4回の比較です。

ここで使うHAIRETSUの要素数は10個なので、
4回比較します。

CASL2では文字コードで大小を判断して、
例えばAなら41、Bなら42…と比較して探します。

配列HAIRETSUに「A」から「J」が入っていて、
「H」の要素番号「7」を返すようにします。
GR0に「H」を設定します。

LeftはGR1を、RightはGR2を、
MIDはGR3を使います。
LeftやRight、MIDは、変動するので、
先頭のアドレスをGR4に退避して固定します。
これは後で見つかった位置を返す時に使います。

それぞれのアドレスを指します。
先頭アドレスを仮に「101」とします。
イメージ的にはビジネスホテルの部屋番号みたいなものでしょうか。

左端の部屋は101号室、右端の部屋は110号室。
真ん中の部屋は(101+110)を2で割ります。
CASL2では右に1ビットシフトします。
GR3にGR1を加え、更にGR2を加え、右に1ビットシフトすると、
105号室がGR3になります。

それでは「Eさん」をGR5に呼び出します。

GR5のEさんとGR0のHさんを比べ、MIDのEさん(文字コード45)は
Hさん(文字コード48)より小さいので、探索対象を後ろに絞ります。

USHIROにジャンプします。
GR3の1つ後ろをLeftであるGR1に設定します。

この繰り返しで、GR1のLeftがGR2のRightよりも大きくなった、
または、Hさんが見つかった時にループを抜けます。

MIDのアドレスから先頭アドレスが入っているGR4を引くと、
見つかった位置が先頭からどれだけ離れているか求まります。
GR3に「7」が求まったらそれを文字に変換して、出力します。

出力結果です。

プログラムはこちらになります。

TEST START
RPUSH


LD GR0,=’Z’ ;誰を探すか
LAD GR1,HAIRETSU
LD GR4,GR1 ;GR1の先頭アドレスを固定用にコピー
LD GR2,GR1
ADDA GR2,=9 ;配列の右端のアドレスを設定

LOOP LD GR3,GR1 ;GR3にMIDのアドレスを求める
ADDA GR3,GR2
SRL GR3,1

LD GR5,0,GR3 ;GR5にMIDの客を呼び出す
CPA GR5,GR0 ;探しているお客か?
JZE ATTA
JMI USHIRO

MAE LD GR2,GR3
LAD GR2,-1,GR2
JUMP LOOP

USHIRO LD GR1,GR3
LAD GR1,1,GR1
CPA GR1,GR2
JPL NAINAI
JUMP LOOP

ATTA ;お客が見つかった
SUBA GR3,GR4
ADDA GR3,=’0′
ST GR3,ICHI
OUT MOJI,LEN
JUMP FIN

NAINAI ;お客が見つからない
OUT MOJI2,LEN2

FIN

RPOP
RET

HAIRETSU DC ‘ABCDEFGH’
MOJI DC ‘Pos=’
ICHI DS 1
LEN DC 5
MOJI2 DC ‘MITUKARANAKATTA’
LEN2 DC 15

END

赤枠の部分を変えて、
見つからなかった場合や、探索文字をBなどの前側で
動作させてみて、無事に動きました。

探索文字をBにして、Bさんを探した結果。

この配列にないZさんを探した結果。

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

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

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

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

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

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

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

アセンブラCASL2で「線形探索」を作ってみた

この記事では、アセンブラ言語で「線形探索」について簡単な例題で学べます。
シンプルな図解を用いています。また、アセンブラとアルゴリズムのの本の紹介もしています。

<<関連記事>>

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

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

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

HAIRETSUという名前の配列を作りました。
文字コードの値で大小を比較します。
Aなら41、Eなら45です。
要素0から要素5まで、Xは先頭から何番目か
(先頭を0として、どれだけ離れているか)を求めます。

この配列の先頭をGR1、おケツをGR5に設定します。

先頭からおケツまで移動するアドレスをGR2とします。
GR2は、今チェックしている配列のアドレスです。
その、今チェックしているアドレスの中身をGR3に入れます。
探す文字XをGR4に格納します。

GR2を移動していきながら、
Xと等しいか調べていきます。
GR2の中身であるGR3と、Xが入っているGR4を
比較していきます。
調べている位置のGR2がおケツのGR5より大きくなった場合と、
調べている場所の中身のGR3とXが入っているGR4が等しくなったら
ループを抜けます。

ループを抜けて、見つかった位置は、先頭からどれだけ
離れているか計算して、その距離を文字に変換して、
ICHIに格納して、「X=位置」の形で出力します。

出力結果です。

プログラミングです。

TEST START
RPUSH


LAD GR1,HAIRETSU ;先頭アドレス
LAD GR2,HAIRETSU ;配列の先頭からおケツまでの移動アドレス
LD GR5,GR1 ;配列おケツ
ADDA GR5,=5 ;おケツは先頭から「5」の距離
LD GR4,=’X’ ;GR4に探すべき値、Xを入れる

LOOP
LD GR3,0,GR2 ;比較する要素の中身
CPA GR3,GR4 ;今調べている値はXか?
JZE FIN ;等しかったらループを抜ける
LAD GR2,1,GR2 ;調べる配列を1つ先に進める
CPA GR2,GR5 ;最後までチェック済か
JPL FIN
JUMP LOOP

FIN SUBA GR2,GR1 ;見つかった位置は先頭からどれだけ離れているか
ADDA GR2,=’0′ ;距離を文字に変換
ST GR2,ICHI ;先頭からの距離をICHIに入れる
OUT MOJI,LEN

RPOP
RET

HAIRETSU DC ‘CBEAXD’
MOJI DC ‘X=’
ICHI DS 1
LEN DC 3

END

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

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

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

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

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

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

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

アセンブラCASL2で「配列の最大値と最小値」を作ってみた

この記事では、アセンブラ言語で「最大値と最小値」について簡単な例題で学べます。
シンプルな図解を用いています。また、アセンブラとアルゴリズムのの本の紹介もしています。

<<関連記事>>

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

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

疑似言語によるアルゴリズムをCASL2で再現してみたら、両方学べて
一石二鳥なのではと思い、今回は「配列の最大値」を作って、一部改変して最小値も作りました。

HAIRETSUという名前の配列を作りました。
文字コードの値で大小を比較します。
Aなら41、Eなら45です。
要素0から要素4まで、
C,B,E,A,Dの順で入っています。

先頭の要素0であるCを仮の最大値として、
Cより大きかったら仮の最大値を更新して、
Cより小さかったらそのままにして、
Cと比較する要素を後ろに1つずつ移動します。

配列の先頭アドレスをGR1、
仮の最大値GR2に入れて、
GR1が指す配列の中身をGR3にします。

ループの終了条件として、
配列のおケツを超えたら終わるようにするので、
おケツの番地をGR4に入れます。

では、実行結果を見てみます。

「MAX=」
の=の後ろに最大値が出力されるようにします。
文字数は合計5文字です。

プログラムです。

TEST START
RPUSH


LAD GR1,HAIRETSU ;先頭アドレス
LD GR2,0,GR1 ;仮の最大値
LD GR4,GR1 ;配列おケツ
ADDA GR4,=4

LOOP LAD GR1,1,GR1 ;要素1番目以降に進める
CPA GR1,GR4 ;最後までチェック済か
JPL FIN
LD GR3,0,GR1 ;比較する要素の中身
CPA GR3,GR2 ;仮の最大値と要素の中身を比べている
JMI KAENAI ;仮の最大値の方が大きかったら変えないのでジャンプ
LD GR2,GR3 ;仮の最大値更新処理
KAENAI JUMP LOOP

FIN ST GR2,MAX ;仮の最大値を入れる
OUT MOJI,LEN

RPOP
RET

HAIRETSU DC ‘CBEAD’
MOJI DC ‘MAX=’
MAX DS 1
LEN DC 5

END

最後に、最大値ではなく、最小値を求めるように
改変します。

変更した所でポイントとなるのは、

赤枠の部分です。
あとは変数名とか細かい所を変えました。

最小値の実行結果です。

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

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

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

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

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

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

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

アセンブラ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年秋にうるう年を含む問題が出題されました。

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

アセンブラCASL2でユークリッドの互除法を作ってみた。

この記事では、アセンブラ言語で「ユークリッドの互除法」について簡単な例題で学べます。
理解の助けになるように、シンプルな図解も用いております。また、アセンブラとアルゴリズムのの本の紹介もしています。

<<関連記事>>

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

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

疑似言語によるアルゴリズムをCASL2で再現してみたら、両方学べて
一石二鳥なのではと思い、今回は最大公約数を求める、「ユークリッドの互除法」を作ってみました。

GR1に66、GR2に42を設定して、
その最大公約数が6になることをプログラミングで確認します。
大きい方から小さい方を引いて、その数を
大きい方に代入して、最終的に両方の数が一致した値が、
最大公約数になるアルゴリズムです。

66の方が42より大きいので、
66-42=24をGR1に格納します。

今度は、24と42では、
42の方が大きいので、
42-24=18をGR2に格納します。

その次に、24と18では、24の方が大きいので、
24-18=6をGR1に格納します。

6と18では、18の方が大きいので、
18-6=12をGR2に格納します。

6と12では12の方が大きいので、
12-6=6をGR2に格納します。

最後にGR1とGR2が6で等しくなったので、
ループを抜けて、これを最大公約数とします。

実行結果です。

このプログラミングです。

TEST START
RPUSH

LAD GR1,66
LAD GR2,42

LOOP CPA GR1,GR2
JZE FIN
JMI NIHE
SUBA GR1,GR2
JUMP LOOP

NIHE SUBA GR2,GR1
JUMP LOOP

FIN ADDA GR1,=’0′
ST GR1,SUU
OUT SUU,LEN

RPOP
RET

SUU DS 1
MOJI DC ‘DESU’
LEN DC 5

END

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

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

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

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

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

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

アセンブラCASL2でバブルソートを作ってみた

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

<<関連記事>>

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

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

シミュレーターと過去問を解くまでの勉強に使った参考書はこちらです
平成26年秋の過去問にバブルソートが出題されました。

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

配列BUBに「CBEAD」という文字が入っています。
これを「ABCDE」と並び替えます。
CASL2ではAは41、Bは42…という文字コードが割り当てられていて、
その大小で比較します。

バブルソートは、簡単に言うと、
「おケツから頭に向かって、お隣さん同士、どっちが大きいかを
比較するアルゴリズム」です。

まず、この図ですと、
AとDはDの方が大きいから、このまま。

EとAは、Eの方が大きいから交換

BとAはBの方が大きいから交換

CとAはCの方が大きいから交換

これで、先頭のAの場所が決定しました。

もう一度、配列のおケツから同じように
交換して、今度はBを確定していきます。
この時の頭をGR1、おケツから交換するアドレスをGR2

おケツと比較する位置をGR3、
GR2の値をGR4、GR3の値をGR5
値交換に使う作業領域をGR6(TEMPなどと呼ばれる)にします。

外ループでGR1である頭からの位置、
内ループでおケツから交換していくGR2が変わっていきます。

内ループはGR2がGR1より小さくなったら抜けて、
外ループはGR1が最後尾まで行ったら抜けます。
配列の最後尾の位置をGR7とします。

実行して見ます。

「CBEAD」と入力します。

並び替え前の配列が出力されます。

並び替え後の配列が出力されます。

以下プログラムになります。

TEST START
RPUSH


IN BUB,LEN
OUT BUB,LEN

LAD GR7,BUB
ADDA GR7,=4
LAD GR1,BUB

LOOP1
LAD GR2,BUB
ADDA GR2,=4

LOOP2 LD GR3,GR2
SUBA GR3,=1
LD GR4,0,GR2
LD GR5,0,GR3
CPA GR4,GR5
JMI KOUKAN
JUMP SHORI

KOUKAN LD GR6,GR4
LD GR4,GR5
LD GR5,GR6
ST GR4,0,GR2
ST GR5,0,GR3

SHORI LAD GR2,-1,GR2
CPA GR2,GR1
JPL LOOP2

LAD GR1,1,GR1
CPA GR1,GR7
JMI LOOP1

OUT BUB,LEN
RPOP
RET
BUB DS 5
LEN DC 5
END

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

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

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

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

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

シミュレーターと過去問を解くまでの勉強に使った参考書はこちらです
平成26年秋の過去問にバブルソートが出題されました。

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

13 CASL2アセンブラ、2進数に基数変換してみました。

この記事では、アセンブラ言語で「基数変換」についての簡単な例題が学べます。
今回は、13を0と1の2進数に変換するサブルーチンの例を掲載しております。
また、アセンブラの本の紹介もしています。

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

13を「0000000000001101」と表示するサブルーチンの出力結果です。

左に1ビットシフト(2倍)をして、1だったらオーバーフローするので、
JOVで’1’を表示する処理に分岐します。

GR1に13を設定しました。
GR2に出力用の配列の先頭アドレスを設定しました。
GR3にループカウンタを設定しました。
GR4を使って、配列ARRAYのGR2が指し示すアドレス位置の中身を操作します。 

そのイメージ図です。

サブルーチンのコードはコチラです。

TEST START
 RPUSH

 LAD GR1,13 ;2進数に変換したい数字をGR1に設定
 LAD GR2,ARRAY ;出力用配列ARRAYの先頭アドレスをGR2に設定
 LAD GR3,16 ;ループカウンタ

;<<配列に格納するループ>>
LOOP CPL GR3,=0 ;ループ終了条件。GR3と0を比較する
 JZE FIN ;ループカウンタがゼロになったらFINへ分岐
 SLL GR1,1 ;GR1に設定された数値を1ビット左へ(2倍した)
 JOV ONE ;シフトされた数がオーバーフローしたら(1だったら)ラベルONEに分岐

 LD GR4,='0' ;GR4に'0'を設定
 ST GR4,0,GR2 ;'0'を配列ARRAYに格納 
 JUMP SKIP ;次の処理の為にラベルSKIPに分岐する


ONE LD GR4,='1' ¡GR4に'1'を設定
 ST GR4,0,GR2 ;'1'を配列ARRAYに格納


SKIP LAD GR2,1,GR2 ;GR2のアドレスを1つ先に進める
 LAD GR3,-1,GR3 ;ループカウンタにしているGR3をデクリメントする
 JUMP LOOP ;ループの先頭に分岐する
;<<ループ ここまで。>>


FIN OUT ARRAY,LEN
 RPOP
 RET
ARRAY DS 16 ;配列ARRAYを用意
LEN DC 16 ;配列の出力文字数

 END

お疲れ様でした。
勉強のリフレッシュに、写真で息抜きを致します。

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

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

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

CASL2のおススメ本です。

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

遊歩道の桜です。

 

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

自己紹介


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

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


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



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

午前免除試験

午後試験のオススメ本

スコアレポート

12 CASL2アセンブラで二重ループを使って階段を作ってみた。

この記事では、アセンブラ言語で1から9までの階段を作りながら、「二重ループ」と、「数値を数字に変換」を使った例を掲載しております。
インクリメントも利用して、階段を作ってみました。

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

過去問に取り組むまでのウォーミングアップにして頂けたら幸いです。
最初にこのサブルーチンの実行結果を表示します。

空の配列に、1を1つ、2を2つ…最後に9を9つ入れます。
1から9までの数値をGR1に設定します。

出力する配列にDANという名前を付けて、配列の先頭をGR2で指し示しました。
そのイメージです。

配列に格納する際、数値を数字にするのに「文字コード’0’」を加えています。
具体的には「1」を出力するのに、文字コードを「0031」にするので、文字コードが「0030」である’0’を加えております。
文字コードについては、こちらの記事が分かりやすいです。

文字コードを加算するのに、GR3を使いました。
1を1回、2を2回…9を9回と数字の分だけ配列に挿入する処理を繰り返す、内ループのカウンタをGR4にしました。
外ループでは、GR1で、1~9までインクリメントしています。

では、プログラミングです。

TEST START
 RPUSH
 LAD GR1,1; GR1に1を設定

LOOP1 LD GR3,GR1; 外ループ:LOOP1 文字出力用にGR3にGR1の値を読み込む
 LD GR4,GR1; 配列格納用にGR4にGR1の値を読み込む
 ADDL GR3,='0'; 数字を出力するのに文字コード’0’を加算する
 LAD GR2,DAN; 出力用の配列DANの先頭のアドレスをGR2に設定する


LOOP2 ST GR3,0,GR2 ;内ループ:LOOP2 数字を配列DANに格納する
 LAD GR4,-1,GR4 ;配列に出力する回数をデクリメント
 CPL GR4,=0 ;配列に出力する回数がゼロと等しいか
 JZE PRINTOUT ;数字を配列に格納する処理が終わったらラベルPRINTOUTに分岐する
 LAD GR2,1,GR2 ;配列の位置を次に進める
 JUMP LOOP2;内ループの先頭に分岐する 


PRINTOUT ST GR1,LEN; 配列の長さをLENに格納する
 OUT DAN,LEN; 配列を出力する
 LAD GR1,1,GR1; 次の数字を出力するのでインクリメントする
 CPL GR1,=9; 出力回数が9よりも大きいか比較
 JPL FIN; ↑の場合はFINへ分岐
 JUMP LOOP1; そうでない場合は外ループの先頭へ 


FIN RPOP
 RET

DAN DS 10;出力する配列を用意
LEN DS 1;出力する文字数

 END

では、実際にシミュレーターを動かして行きます。

外ループに入る前に、GR1に1が入りました。

<<外ループ LOOP1に入りました。>>

数値「1」を数字「’1’」に変換するのに使うGR3に1が入りました。

配列に格納する回数に使うGR4に1が入りました。

数字を出力するのに、’0’(文字コード0030)をGR3に加算されました。

出力用の配列の先頭アドレスがGR2に設定されました。
(実行環境によってアドレスは異なります。)

<<内ループ LOOP2に入りました>>

GR3の数字’1’(文字コード0031)が配列DANのGR2が指し示すアドレス(ここでは先頭アドレス)に格納されました。

配列に格納する残り回数であるGR4がデクリメントされました。

GR4の値がCPLで0と比較され、等しいのでゼロフラグが立ちました。

JZEより内ループを抜けて出力処理のラベルPRINTOUTに分岐しました。
文字数LENにGR1の値1が格納されました。

配列DANに格納された、’1’を出力しました。

次は2を出力するので、GR1がインクリメントされて2が入りました。

GR1に入っている2とCPLで9が比較され、2は9より小さいのでSFが立ちました。

<<外ループ LOOP1>>

外ループLOOP1の先頭に分岐しました。

文字コードを加算して数字に変換するのに使うGR3に2が入りました。

2を配列に格納する回数、2回を入れるGR4に2が入りました。

GR3に’0’(文字コード0030)が加算されて、0032になりました。

GR2に配列DANの先頭アドレスが設定されました。

<<内ループ LOOP2>>

GR3の数字’2’を配列DANのGR2が指し示すアドレスの所(この場合は先頭アドレス)に格納されました。

配列に格納される回数のGR4がデクリメントされました。

CPLで配列に出力される回数の残りGR4が0と等しいか比較され、この場合はGR4=1なので、分岐はしないで次に進みます。

配列のアドレスを1つ先に進めるので、GR2がインクリメントされました。

内ループの先頭に分岐します。


GR3に入った’2’が、GR2が指し示す配列のアドレス(この場合は先頭+1)の位置に格納されました。

配列に格納される回数であるGR4がデクリメントされました。

CPLでGR4の値が0と比較され、等しかったのでゼロフラグが立ち、内ループを抜け出力ラベルPRINTOUTに分岐します。


文字数ラベルLENに、GR1の値2が格納されます。

配列DANの「22」が出力されました。

次は3を出力するので、GR1がインクリメントされました。

CPLでGR1の3と9が比較され、まだ9回まで行っていないので、SFが立ちました。

外ループの先頭に行って、次は3が出力される処理になります。

あとは繰り返しなので、’9’が9回出力された直後まで進めます。
レジスタの値は、この様になっています。

GR1がインクリメントされます。

CPLでGR1が9と比較され、A(16進数の10)は9より大きいので、JPLでFINに分岐して、このサブルーチンは終わりました。

お疲れ様でした。
勉強のリフレッシュに、写真で息抜きを致します。

恵比寿ガーデンプレイス、フランスのクリスタルメーカー、バカラのシャンデリアです。

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

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

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

TEST START
 RPUSH
; GR1に1を設定

; 外ループ:LOOP1 文字出力用にGR3にGR1の値を読み込む
; 配列格納用にGR4にGR1の値を読み込む
; 数字を出力するのに文字コード’0’を加算する
; 出力用の配列DANの先頭のアドレスをGR2に設定する


;内ループ:LOOP2 数字を配列DANに格納する
;配列に出力する回数をデクリメント
;配列に出力する回数がゼロと等しいか
;数字を配列に格納する処理が終わったらラベルPRINTOUTに分岐する
;配列の位置を次に進める
;内ループの先頭に分岐する 


; 出力ラベルPRINTOUT 配列の長さをLENに格納する
; 配列を出力する
; 次の数字を出力するのでインクリメントする
; 出力回数が9よりも大きいか比較
; ↑の場合はFINへ分岐
; そうでない場合は外ループの先頭へ 


FIN RPOP
 RET

CASL2のおススメ本です。

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


恵比寿ガーデンプレイスです。

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

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

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

 

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

自己紹介


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

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


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



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

午前免除試験

午後試験のオススメ本

スコアレポート

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