平成21秋 問12 アセンブラ のプログラミング(コメント付き)

この記事では、過去問のアセンブラの問題に載っているプログラムを実際に自分の環境で作成して動かすのに使ったコードと、トレースのノートを掲載しています。
この記事を通してアセンブラだけでなくアルゴリズムのトレース力向上にもお役立て下さい。

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

この問題は平成25年春の過去問と似ています。

この問題は、ビット列Aのある部分をビット列Bに置換するプログラムです。
具体例によると、ビット列Aの55ビット目(3語目の7ビット)から66ビット目(4語目の2ビット)までをB列に変えます。55ビット目をpとしてGR2に、B列の置換対象の12ビットをqとしてGR3に設定します。
ビット列Aの先頭アドレスはGR1に設定します。

ビット列Aの対象区間は、先頭を0ビットとして55ビットからなので、1語を16ビットとして、3語目の7ビット目~4語目の2ビット目までです。
ビット列Aの3語目、4語目を仮に「0101010101010101」
「0101010101010101」とします。

これをビット列Bである「1011000111010000」置き換えるので、ビット列Aは
操作前A:「0101010101010101」
     「0101010101010101」
操作後A:「0101010101100011」
     「1010010101010101」
と置換されます。

プログラムはこちらになります。
H21A_REPLACEという名前で作りました。
シミュレーターと過去問を解くまでの勉強に使った参考書はこちらです

先ほど2進数で書いた所は、全て16進数に直してプログラミングしています。
例えばビット列Aの「0101010101010101」は「#55」にしています。ビット列Aの先頭アドレスは「ARETSU」というラベルを貼りました。
そこに0語目~5語目までを格納しました。

では、動かして見ます。
シミュレーターを使って、少しくどいかもしれませんが、丁寧目にトレースしていきます。

まず、主記憶ですが、ビット列Aが入っているARETSUは、このようになっています。
先頭が#1020で、置換対象である3語目が#1023、4語目が#1024です。

レジスタはビットの状態が分かるように2進数表記にします。

GR1にビット列Aの先頭アドレスが入りました。

GR2に置換対象位置である55(0ビットを先頭として56番目)が入りました。

GR3に置換するビットの長さである12が入りました。

GR0にビット列Bが入りました。

副プログラム問題文のREPLACEを呼び出しました。

ビット位置の55をGR4に読み込みました。

55は何語目か求めるために、1語16なので55を16で割りました。
その為にSRL 4しています。55は3語目と求まりました。
(0語目、1語目、2語目、3語目)

GR1に3語先のアドレスを設定しました。

55は3語目の中で7ビット目だということが#000FとANDを取ることによって
求まりました。

GR4に、16が入りました。3語目の7ビット以降のビット数を求めるため、
16から7を減算します。

GR4に16から7を引いて、9と求まりました。

GR5にビット列Bを退避しました。
これはビット列Aの4語目の置換に使います。

GR6に置換に使うマスクを作る為に#8000が入りました。

マスクを作るのに論理シフトします。シフトするビット数を
12から1を引いて11と求まりました。

注意して頂きたいのが次に行うシフトは「算術シフト」です。
つまり、空いた所に先頭ビットと同じビットが入ります。

GR6が、#8000である「1000000000000000」を11ビット右に算術シフトして、「1111111111110000」になりました。

今作ったマスクを、GR7に退避します。
これはビット列Aの4語目の置換の作業に使うマスクになります。

GR0で、ビット列Bを右に7ビットシフトしました。

GR6で、マスクを右に7ビットシフトしました。

GR5で、4語目用にビット列Bを左に9ビット論理シフトしました。

GR7で4語目用にマスクを左に9ビットシフトしました。

GR2にビット列Aの3語目を読み込みました。

GR6「0000000111111111」にGR2の「0101010101010101」のANDを取りました。
結果は「0000000101010101」です。

GR2「0101010101010101」とGR6「0000000101010101」のXOR排他的論理和を取りました。
結果は「0101010000000000」です。

GR2に右シフトしたビット列BであるGR0「0000000101100011」を足しこみます。
結果は「0101010101100011」になります。

主記憶のビット列Aの3語目に格納されました。

GR2にビット列Aの4語目が読み込まれました。

GR7に「1110000000000000」とGR2「0101010101010101」のANDを取りました。結果は「0100000000000000」になりました。

GR2に「0101010101010101」とGR7の「0100000000000000」の排他的論理和XORを取ります。結果は「0001010101010101」になりました。

GR2に「0001010101010101」と左シフトしたビット列Bの「1010000000000000」のORを取ります。
結果は「1011010101010101」になります。

ビット列Aの4語目に格納されました。

トレースは以上になります。
今度受けるので、自分の勉強になりました。
どなたかのお役に立てたらうれしいです。
誰か見ている人いますか?いたら手を振って下さい(=^・^=)

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

<<プログラム>>

H21A START
RPUSH
LAD GR1,ARETSU
LD GR2,=55 ;pの位置55
LD GR3,=12 ;qの長さ
LD GR0,=#B1D0 ;B列に置換語を読み込む
CALL REPLACE
RPOP
RET
ARETSU DC #0000 ;A列0語目
DC #0000
DC #0000
DC #5555 ;A列3語目(置換対象)
DC #5555 ;A列4語目(置換対象)
DC #0000


REPLACE
RPUSH
LD GR4,GR2 ;GR4←p置換開始位置を設定
SRL GR4,4 ;GR4←p/16 A列の先頭語から何語後ろかを求めている
ADDA GR1,GR4 ;GR1を置換対象後(この場合第3語)に位置付ける
AND GR2,=#000F ;第3語目の何ビットから置換するのか(7ビット)求めている
LD GR4,=16 ;第3語で置換する分のビット数の計算の為
SUBA GR4,GR2 ;16-7で3語目の対象ビットは9ビット
LD GR5,GR0 ;置換するB列を退避
LD GR6,=#8000 ;置換する時に使うマスクを作る
SUBA GR3,=1 ;マスクを作る時にシフトするビットの調整
SRA GR6,0,GR3 ;注意!SRAで「算術」シフトだから空いた所に1が入る
LD GR7,GR6 ;マスクを退避する
SRL GR0,0,GR2 ;置換するB列を7ビット右にシフトする
SRL GR6,0,GR2 ;置換に使うマスクを7ビットシフトする
SLL GR5,0,GR4 ;ビット列Aの4語目の置換に使用
SLL GR7,0,GR4 ;ビット列Aの4語目の置換に使用
LD GR2,0,GR1 ;ビット列Aの3語目を読み込む
AND GR6,GR2 ;ビット列Aの置換対象の前の部分をマスクで0にする
XOR GR2,GR6 ;排他的論理和で置換対象の部分を0にする
OR GR2,GR0 ;ビット列Bを足しこむ
ST GR2,0,GR1 ;ビット列Aの3語目に格納する
LD GR2,1,GR1 ;ビット列Aの4語目を読み込む
AND GR7,GR2 ;ビット列Aの置換対象の語の後ろの部分をマスクで0にする
XOR GR2,GR7 ;排他的論理和で置換対象の部分を0にする
OR GR2,GR5 ;ビット列Bの退避しておいた部分を足しこむ
ST GR2,1,GR1 ;ビット列Aの4語目に格納する
RPOP
RET
END

トレースに使ったノートです。

シミュレーターと過去問を解くまでの勉強に使った参考書はこちらです

アセンブラ過去問プログラミング
アセンブラ自作サンプルへ
基本情報技術者試験トップへ
息抜きに、写真で癒し(=^・^=)

表計算?それともCASL2アセンブラ!?どっちがいいの!?基本情報技術者試験のプログラミング言語の選択について

この記事では主にプログラミング未経験者の基本情報技術者試験の言語の選び方について書きます。未経験者ですと、表計算かアセンブラの2択になると思います。

「表計算タイプ」、「アセンブラタイプ」の判別基準や、人気講師の方の記事リンクを掲載して、実際に問題を解きながら選択できる内容となっております。

メインメニューに戻る
資格トップへ
基本情報技術者試験トップへ
令和2年度(令和3年1月)合格報告

私は仕事でExcelを使っていることや、MOSのExcelExpertの取得者ということもあって、当然のことながら表計算を選びました。

しかし、表計算の問題文の文章の量が多すぎて、どうしたものか悩んでいました
また、実務や自主的にExcelを学んだ来たからこそ基本情報技術者試験の表計算の問題になんともいえないモヤモヤした違和感を持ってしまいました。

そこでアセンブラを試しにやってみた所、ハードウェアの勉強にもなりますし、とにかく面白かったです。なんというか、名探偵コナンなどの推理アニメとかに出て来そうな暗号解読みたいなワクワク感がありました。

そこで表計算からアセンブラに言語を切り替えました。

どっちか選ぶのに迷っている方は、1時間ぐらい両方やってみて、
自分にどっちが合うのか決めると、決めやすくなると思います。

本当に合わない場合は、1時間も持たないと思うので、その分決断が速くなるかもしれません。

とは言え両方の教材を同時に揃えるのは難しいので、受験ナビさんの記事で
CASL2は意外と短時間で学習できる
CASL2で必要となる2進数の知識
表計算(1)
表計算(2)
の記事が選択の基準になるかもしれません。


これから書く「表計算タイプ」、「アセンブラタイプ」は、あくまで参考程度にとどめて下さい。

●表計算タイプ
・長文読解が得意
・三度の飯よりExcelらぶらぶ
・今さら何か新しい言語を学ぶのもなんだか難しい

●アセンブラタイプ
・表計算の得点に伸び悩み
・2進数や16進数が好き
・試験後に何らかのプログラミング言語を学ぶ予定がある

関連記事
シミュレータと参考書

表計算とアセンブラのお薦め参考書

メインメニューに戻る
資格トップへ
基本情報技術者試験トップへ
令和2年度(令和3年1月)合格報告

平成21春 問12 アセンブラ のプログラミング(コメント付き)

この記事では、過去問のアセンブラの問題に載っているプログラムを実際に自分の環境で作成して動かすのに使ったコードと、トレースのノートを掲載しています。
この記事を通してアセンブラだけでなくアルゴリズムのトレース力向上にもお役立て下さい。

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

基本情報技術者試験がコロナで中止や延期になり、中々プログラミングのスキルも身に付かずに悶々としていたので、思い切って過去問を頼りにプログラミングをして見ることにしました。第一回は平成21年春の問題です。

プログラムMULSは、被乗数(かけ「られる」数)32ビットと、乗数(かける数)16ビットの計算をして、その結果である積32ビットを返します。
被乗数と乗数のどっちがどっちか分からなくなりそうなので、被乗数のラベルをかけ「られる」数から、RARERU、乗数をKERU、積をSEKIと名付けてプログラミングしました。GR1にはRARERUの先頭アドレス、GR2にはRERUそのもの、GR3にはSEKIの先頭アドレスを設定しています。

具体例として、被乗数RARERUの上位語には16進数で「2」、下位語には16進数で「6」、乗数KERUには16進数「3」とします。
プログラミングの名前はH21SMULSとします。

プログラミングは下記になります。
シミュレーターと過去問を解くまでの勉強に使った参考書はこちらです

<<プログラミング>>
H21SMULS START
RPUSH
LAD GR1,RARERU ;かけ「られる」数の先頭アドレスをGR1
LD GR2,KERU ;かける数自体をGR2
LAD GR3,SEKI ;積の先頭アドレスをGR3
LAD GR6,0 ;積 上位語の初期化
LAD GR7,0 ;積 下位語の初期化
LD GR4,0,GR1 ;被乗数 上位語の取出し
LD GR5,1,GR1 ;被乗数 下位語の取出し
LP SRL GR2,1 ;乗数を1ビット右にシフト
JOV ADD32 ;「a」最下位桁がゼロかどうかで分岐する
JZE FIN ;全部乗数が0だったら押しマシ
JUMP NEXT ;加算処理をスキップ(下位桁が0だった場合)
ADD32 ADDL GR6,GR4 ;被乗数の上位語を足す
ADDL GR7,GR5 ;被乗数の下位語を足す
JOV ADJ1 ;「b」下位語の加算で桁上りした場合に分岐
JUMP NEXT ;下位語の桁上げが無いので桁上げ処理をスキップ
ADJ1 ADDL GR6,=1 ;桁上げ処理(下位桁オーバーフローで上位桁へ)
NEXT SLL GR4,1 ;被乗数の上位語を1ビット左にシフト
SLL GR5,1 ;「c」被乗数の下位語を1ビット左にシフト
JOV ADJ32 ;左シフトによって桁上りした下位語の分を上位語へ
JUMP LP ;次の計算処理へ
ADJ32 OR GR4,=1 ;上位語に下位語からの桁上りを足しこむ
JUMP LP ;次の計算処理へ
FIN ST GR6,0,GR3 ;乗算結果(上位語)の格納
ST GR7,1,GR3 ;乗算結果(下位語)の格納
RPOP
RET
RARERU DC #2
DC #6
KERU DC #3
SEKI DS 2
END

それでは動かして見ます。


GR1、GR2、GR3にそれぞれ被乗数先頭アドレス、乗数、積の先頭アドレスが入り、
GR4に被乗数の上位語、GR5に被乗数の下位語、GR6、GR7に積の値のゼロによる初期化が入りました。

ループ1回目
GR2が1ビット右シフトしました。また、OFが1なので、オーバーフローしました。

GR6、GR7に被乗数の上位語下位語が足されました。

GR4、GR5に被乗数が左に1ビットされて2倍になりました。

ループ2回目

GR2に乗数が右に1ビットされ、OF、ZFが1になりました。

GR6、GR7に被乗数の上位語下位語とシフトした分が足されました。

GR4、GR5に被乗数が左に1ビットされて2倍になりました。

ループ3回目
ゼロフラグが1になりました。

では次に、プログラム2のMULを作ります。
名前をH21SMULにします。

プログラムMULは、被乗数(かけ「られる」数)32ビットと、乗数(かける数)32ビットの計算をして、その結果である積32ビットを返します。
被乗数のラベルをかけ「られる」数から、RARERU2、
乗数をKERU2、積をSEKI2と名付けてプログラミングしました。
GR1にはRARERU2の先頭アドレス、GR2にはRERU2の先頭アドレス、GR3にはSEKI2の先頭アドレスを設定しています。
また、領域SVは、計算結果の退避につかいます。

具体例として、被乗数RARERU2の上位語には16進数で「2」、下位語には16進数で「6」、乗数KERU2には上位語「3」、下位語「5」とします。
プログラミングの名前はH21SMULとします。

プログラミングは下記になります。
先ほどのH21SMULSを副プログラムとして呼び出して使用します。
その際の渡す値は主プログラムから渡されるので、副プログラムの方は消しました。

<<プログラミング>>
H21SMUL START
RPUSH
LAD GR1,RARERU2 ;かけ「られる」数の先頭アドレスをGR1
LAD GR2,KERU2 ;かける数自体をGR2
LAD GR3,SEKI2 ;積の先頭アドレスをGR3
PUSH 0,GR3 ;積の上位語のアドレスをスタックに積む
PUSH 0,GR2 ;乗数の上位語のアドレスをスタックに積む
LD GR2,1,GR2 ;乗数の下位語を読み込む
CALL H21SMULS ;プログラム1を呼ぶ 被乗数×乗数下位語→積A
POP GR2 ;スタックから乗数の先頭アドレスを取り出す
LD GR2,0,GR2 ;「d」乗数の上位語を読み込む
LAD GR3,SV ;結果(積B)の格納先として作業領域SVの先頭アドレスを設定
CALL H21SMULS ;プログラム1を呼ぶ 被乗数×乗数上位語→積B
LD GR6,1,GR3 ;「e」積Bの下位語であるSV+1の値を読み込む
POP GR3 ;積Aの上位語のアドレスを取り出す
ADDL GR6,0,GR3 ;積Aの上位語と積Bの下位語を加算
ST GR6,0,GR3 ;加算結果をGR3に格納
RPOP
RET
SV DS 2 ;積Bの2語分(結果退避用)
RARERU2 DC #2 ;被乗数(かけられる数)上位語
DC #6 ;被乗数(かけられる数)下位語
KERU2 DC #3 ;乗数(かける数)上位語
DC #5 ;乗数(かける数)下位語
SEKI2 DS 2 ;積の2語分


H21SMULS
RPUSH
LAD GR6,0 ;積 上位語の初期化
LAD GR7,0 ;積 下位語の初期化
LD GR4,0,GR1 ;被乗数 上位語の取出し
LD GR5,1,GR1 ;被乗数 下位語の取出し
LP SRL GR2,1 ;乗数を1ビット右にシフト
JOV ADD32 ;「a」最下位桁がゼロかどうかで分岐する
JZE FIN ;全部乗数が0だったら押しマシ
JUMP NEXT ;加算処理をスキップ(下位桁が0だった場合)
ADD32 ADDL GR6,GR4 ;被乗数の上位語を足す
ADDL GR7,GR5 ;被乗数の下位語を足す
JOV ADJ1 ;「b」下位語の加算で桁上りした場合に分岐
JUMP NEXT ;下位語の桁上げが無いので桁上げ処理をスキップ
ADJ1 ADDL GR6,=1 ;桁上げ処理(下位桁オーバーフローで上位桁へ)
NEXT SLL GR4,1 ;被乗数の上位語を1ビット左にシフト
SLL GR5,1 ;「c」被乗数の下位語を1ビット左にシフト
JOV ADJ32 ;左シフトによって桁上りした下位語の分を上位語へ
JUMP LP ;次の計算処理へ
ADJ32 OR GR4,=1 ;上位語に下位語からの桁上りを足しこむ
JUMP LP ;次の計算処理へ
FIN ST GR6,0,GR3 ;乗算結果(上位語)の格納
ST GR7,1,GR3 ;乗算結果(下位語)の格納
RPOP
RET
END

それでは動かして見ます。
GR1、GR2、GR3にそれぞれ被乗数、乗数、積のアドレスが入りました。

スタックにGR3、GR2にそれぞれ設定したアドレスが積まれました。

GR2に乗数(かける数)の下位語である「5」が入りました。

副プログラムMULSを呼び出しました。

GR6、GR7が積の計算結果の初期化されました。

GR4、GR5に被乗数の上位語、下位語が入りました。

下位語積Aのループ1回目
GR2に乗数かける数が右シフトされました。

GR6、GR7に、計算結果が加算されました。

GR4、GR5で被乗数かけられる数の上位語、下位語が左シフトされました。

下位語積Aのループ2回目

GR2が右シフトされました。
下位桁が0なので、加算はスキップします。

GR4、GR5が左シフトされました。

下位語積Aのループ3回目
GR2で乗数が右シフトしました。
オーバーフローしたので、下位桁が1です。

GR6、GR7で、積の計算結果に加算されました。

GR4、GR5で被乗数(かけられる数)をシフトします。

呼び出し元に戻ります。
GR2に、乗数(かける数)の上位語(先頭)アドレスが入ります。

GR2に乗数の上位語が入ります。

GR3に計算結果退避領域の先頭アドレスが入ります。

副プログラムが呼び出されました。

以下、重複はなるべく避けてトレースします。

上位語積Bのループ1回目

乗数が右シフトされました。


計算結果が加算されました。

被乗数が左シフトされました。

上位語積Bのループ2回目
乗数が右シフトされました。

計算結果に足しこまれました。

被乗数が左シフトされました。

呼び出し元に戻りました。

GR6にGR3(積Bの計算結果)の下位語が入りました。

GR3にSEKI2の先頭アドレス(積Aの計算結果上位語を指す)が入りました。

GR6に演算結果が求められました。

では、トレースに使ったノートです。

シミュレーターと過去問を解くまでの勉強に使った参考書はこちらです

アセンブラ過去問プログラミング
アセンブラ自作サンプルへ
基本情報技術者試験トップへ
息抜きに、写真で癒し(=^・^=)

基本情報技術者試験午後対策使用参考書、教材の紹介

この記事では、基本情報技術者試験の中でも苦手な方の多い午後分野で、私の得点力をグイグイと上げて行ったことに、特に役立った参考書を紹介しています。

メインメニューへ
基本情報技術者試験トップへ
これからプログラミングをはじめる方へ
令和2年度(令和3年1月)合格報告
自己紹介

この本は、午後対策の本で、午後問題に関連した午前問題も学べます。私は午後が苦手でしたが午前以上の得点を取得出来たことに貢献して下さった本です。
午後問題がバランス良く学べます。

アルゴリズムがこの2冊

独習ゼミの人気No.1講師の矢沢久雄先生が書かれた本です。
トレースってどうやるの?という疑問から私の勉強が始まったのですが、
この本でコツコツトレースをしていたら少しずつ力が付いてきました。

こちらも矢沢先生の本です。基本情報技術者試験のシラバスにあるアルゴリズムと
対応してあり、実際にJavaもしくはC言語で作ってトレースをしていました。
プログラミング→トレース→トレースのコードを追加という学習順序で理解が深まります。

それと必須問題であるセキュリティですが、セキュリティ白書2020を購入しました。

セキュリティの最新情報を文章にグラフ、イラストもあって、白書と言うともっと堅苦しいイメージを持って想像していたのですが、オールカラーで見やすいです。

SQLはこの本を使いました。

SQLもですが、実際に手を動かすと特にグループ化の混乱がだいぶ減って来ます。
エディターなどの環境の用意の仕方も書かれています。
私は特にチャプター3が肝だと思います。
SQLの解釈する順序が、何を見ても分からなかったのですが、この本で氷解しました。

言語はCASL2を選択して、この2冊を使っています。

実際にシミュレーターで手を動かすのが最短だと思うので、こちらのシミュレーターを使っています。

午後問題と言えば、本当に問題が長いですよね。私は本を読むのが超遅いので、問題文を読み切れないうちに時間がどんどん過ぎていき、困っています。

講座はスタディングと独習ゼミを利用しました。この資格に関してはどちらも本当に丁寧な講座だと思いますが、さすがに本を読むのが遅すぎると、読解力でつまずきがちです。なので、読解力に関してはユーキャンの速読講座を利用していました。

メインメニューへ
基本情報技術者試験トップへ
これからプログラミングをはじめる方へ
令和2年度(令和3年1月)合格報告
自己紹介

アルゴリズム無料教材

メインメニューに戻る 
基本情報技術者試験トップへ
飲み込みが遅い私がアルゴリズムを攻略するまで
令和2年度(令和3年1月)合格報告

この記事では、無料教材の中で特に合格に導いてくださった教材を紹介します。
高品質な教材をタダで使わせて頂いたので、情報提供者の方々に感謝しつつ、どん欲に使用してきたので、無事に合格を掴めました。

過去問の勉強は、基本情報技術者試験ドットコムを使っています。かなり有名なサイトですね。そこの解答解説で、まだ解説が無い分のアルゴリズム問題については、福嶋先生のふっくゼミの公開動画で学んでいます。こちらは視聴者の制限なく、誰でも視聴できます。

次に、独習ゼミの人気講師の矢沢久雄先生が書かれた連載を紹介します。
受験ナビの記事はどなたでも閲覧できます。
過去問を短く編集してアルゴリズムの試験試験に慣れる問題です。
配列を分割するプログラム(マージソート)

この連載の中から、具体例からヒントを掴む練習問題の、
私がトレースしたノートを公開します。
令和3年1月に合格した者です。

古い昭和の人間なので、
「勉強は恥をかいて覚えるもの」という認識があります。

字は下手ですが、汚くはないと思います。

この猫くんは、What’s Michael?(ホワッツマイケル)という
猫マンガの主人公、都合が悪くなると踊ってごまかす猫のマイケルです。
基本情報技術者試験とは関係ないのですが、息抜きに猫を書きました。

基本的には独習ゼミの矢沢先生の教材を使いましたが、他の先生方の教材で、今の自分の状況に合うものがあれば、貪欲に取り入れて学んでいます。

こちらはおススメの参考書です。

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

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

◆C言語なるほど実験室
これからの基本情報技術者試験の対策に必要になりそうなので、使っています。

メインメニューに戻る 
基本情報技術者試験トップへ
飲み込みが遅い私がアルゴリズムを攻略するまで
令和2年度(令和3年1月)合格報告

アルゴリズムのおススメ本、何を買うべきか迷っている方へ

この記事では、アルゴリズムの本は沢山出ているからどれを買うのか悩んでいる方へ、この本だけは絶対手元に置いておいて!という本を紹介します。

プログラミング未経験からアルゴリズム得点率88%を成し遂げたのに役立った本です。

メインメニューへ
基本情報技術者試験トップへ

飲み込みの遅い私がアルゴリズムを攻略するまで
令和2年度(令和3年1月)合格報告


「アルゴリズム問題がちゃんと解ける本 著:矢沢久雄」

この本は基本のソート、サーチを中心とした、
トレース力が身に付きます。

この本の凄い所は、読者特典の
「動く疑似言語」です。
PowerPointとPDFがあり、パラパラ漫画の原理で、
プログラミングの流れを学習できます。

私はPowerPointを使って、スライドショーで見ながら
トレースをしています。
スライドショーは[F5]を押して開始させ、
[Enter]でトレースして、値の変化で色が変わったりするので、
視覚的に学習できます。
スライドが終わったら[Esc]で終了します。

この読者特典「動く疑似言語」を使って、
バブルソートと、2進数の乗算と再帰呼び出しをノートで
トレースしてみました。

他のアルゴリズムは、そのままなんでもっと分かりやすいと思います。

では、まずはバブルソートから

それから、2進数の乗算と、再帰呼び出しです。

かなり噛み砕いて書かれた本ですが、私は最初、
ユークリッドの互除法で感動していたレベルでした。
しかし、最後の過去問までどうにかゆっくりですが、
理解出来ました。

よく頑張ったな。本番も頑張ろう。

メインメニューへ
基本情報技術者試験トップへ

飲み込みの遅い私がアルゴリズムを攻略するまで
令和2年度(令和3年1月)合格報告

アセンブラCASL2でクール、クーラー、クーリッシュな暗号

この記事では、アセンブラ言語の「配列や文字列の扱い」について簡単な例題で学べます。配列の添字と文字を対応づけている、簡易的な暗号文です。

<<関連記事>>

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

少し前に竹内涼真さんが出演されているアイスのCMを
見ました。
「クール、クーラー、クーリッシュ」っていうアレです。
TVのCMは、聴いているうちに、耳に残る上、
あのアイスの広告が、通勤電車にもあったので、
時々、「クール、クーラー、クーリッシュ」と、
独り言を言ってしまいます。

そこで、アイスをCOMET2のアセンブラ、CASL2で作ろうと思いました。
この様な配列があります。

0番目はA、1番目はB、2番目はC…という風に
暗号を解読するような感じで、数値を文字に当てはめていきます。
例えば、ICEの「I」は8、「C」は2、「E」は4になります。

なので、最初は「8」を入力します。

すると、「8」は文字コードで「38」なので、
レジスタに38と入ります。

GR2に38と入りました。
これを8にする為には、
文字コード30の「0」を使って減算します。

GR2が8になりました。

今度はこの8をアイスの「I」に変換します。
配列MOJIの先頭アドレスをGR3に入れます。

GR3には配列MOJIの先頭アドレスが
ここでは1045と入りました。

このアドレスを8加算(先頭アドレスから8だけ右に移動)すると、
「I」のアドレスになります。

アドレス1045に8を加えて104Dになりました。

レジスタGR4にIを納めます。
Iの文字コードは49です。

この「I」を、出力用の配列DASUの先頭アドレスに格納します。

格納済み文字数をGR1に設定します。

この文字数が3になったらループを抜けて出力します。

同様に、ICEの残りの文字「C」は2、「E」は、4を入力して、
格納します。

出力結果です。
暗号文みたいなプログラムを作ってみたいのと、
「クール、クーラー、クーリッシュ」がループしていたので、
これを作ってみました。

全然汎用性がないのですが、
アイスの売り上げに貢献出来るかも??

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

TEST START
RPUSH


LAD GR1,0 ;出力用配列に格納する場所と格納文字数

LOOP IN KEY,LEN ;文字に変換する数字入力用
LD GR2,KEY
SUBA GR2,=’0′ ;文字から数値に変換
LAD GR3,MOJI
ADDA GR3,GR2 ;変換した数値分右に移動
LD GR4,0,GR3
ST GR4,DASU,GR1
LAD GR1,1,GR1
CPA GR1,=3
JZE FIN
JUMP LOOP

FIN
OUT DASU,LEN2

RPOP
RET

KEY DS 1
LEN DC 1
MOJI DC ‘ABCDEFGHIJ’
DASU DS 3
LEN2 DC 3

END

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

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

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

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

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

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

<<関連記事>>

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

基本情報技術者試験の学習スケジュールを立てた。

この記事では、基本情報技術者試験の学習モチベーションを高め、維持するのに欠かせない、スケジュールを掲載します。また、アルゴリズムと言語(アセンブラ)の参考書の紹介もしています。

基本情報技術者試験トップへ
令和2年度(令和3年1月)合格報告
これからプログラミングをはじめる方へ
飲み込みの遅い私がアルゴリズムを攻略するまで

延期の為、スケジュールを立てなおしました。
アセンブラをガッツリやりたいと思います。

アルゴリズムとCASL2の使用テキストです。
あと、受験ナビさんから情報を得ています。

基本情報技術者試験トップへ
令和2年度(令和3年1月)合格報告
これからプログラミングをはじめる方へ
飲み込みの遅い私がアルゴリズムを攻略するまで

アセンブラCASL2で「再帰呼び出し」を作ってみた

この記事ではアセンブラで、簡単な足し算を使った再帰呼び出しを学習します。
再帰呼び出しは基本情報技術者試験で午前午後問わず出題させる可能性が高いです。

<<関連記事>>

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

2020年からの基本情報技術者試験は、
言語とアルゴリズムの配点が高くなります。
なので、プログラミング未経験の事務員の私は、
非常に焦っています。

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

再帰呼び出しって、RPGで言うとダンジョンの中の迷路に迷って、
HPが0になったらゲームオーバーして魂が抜ける
みたいなイメージがあるのですが、皆さまどうですか??

HPをNとして、N=5(って、よわよわじゃん)だったら、
魂が抜ける前に5を宝箱に移動して、
魂が4になって、それを宝箱に入れて宝箱が
5+4=9になって、また魂が1つ減って3になって、
それを宝箱に入れて箱が5+4+3=12になって、
また魂が1つ減って2になって、宝箱に入れて、
箱が5+4+3+2=14になって、魂が1になって、
箱が5+4+3+2+1=15になって、魂が0になったら
ゲームオーバーで、身体は迷路の中、魂は天国に行って、
お姫様と幸せに暮らしましたとさ、って感じで、
F(N)=N+F(N-1)
の再帰呼び出しを行います。

全然ハッピーエンドじゃないのかな。
でも、天国で幸せならいいか。
話を再帰呼び出しに戻します。

N=5の時は、
F(5)=5+4+3+2+1=15
になり、16進数表記では「F」になります。
そのプログラムを作りました。

フローチャートです。


以下、トレースを行います。

レジスタは、
Nの値をGR1、F(5)を計算する合計をGR2、
出力ウィンドウに表示する文字コード用にGR3を使います。

GR1に「5」、GR2とGR3に「0」を設定します。

文字コード出力用にGR1の値をGR3にコピーします。

+30して文字コードにしました。
(この処理の説明は以下略します。)

「5+」
と表示されました。

GR2にGR1の値を加算します。

GR1の値を1つ減らして「4」にします。

GR1>0なので、
サブルーチン、SAIKIの中で再帰呼び出しを行います。

「4+」
と表示されました。

GR2の値が5から+4されて、9になりました。

GR1の値を1つ減らして「3」にします。

GR1>0なので、
サブルーチン、SAIKIの中で再帰呼び出しを行います。

「3+」と表示されました。

GR2の値が9から+3されて12になりました。
16進数では12は「C」です。

GR1の値を1つ減らして「2」にします。

GR1>0なので、
サブルーチン、SAIKIの中で再帰呼び出しを行います。

「2+」と表示されました。

GR2の値はC(12)から+2されてE(14)になりました。

GR1の値を1つ減らして「1」にします。

GR1>0なので、
サブルーチン、SAIKIの中で再帰呼び出しを行います。

「1+」と表示されました。

GR2の値はE(14)から+1されてF(15)になりました。

GR1の値を1つ減らして「0」にします。

GR1>0が偽になったので、
サブルーチン、SAIKIを抜けます。

メインに戻って、
「GR1=0になったので 抜けます にゃ!!」
と表示してプログラムを終了します。

プログラムはこちらです。

MAIN START
RPUSH


LAD GR1,5
LAD GR2,0
LAD GR3,0

CALL SAIKI
OUT MOJI,LEN0
RPOP
RET

MOJI DC ‘GR1=0 NI NATTANODE NUKEMASU NYA!!’
LEN0 DC 33

SAIKI
LD GR3,GR1
ADDA GR3,=’0′
ST GR3,KAZU
OUT KAZU,LEN
ADDA GR2,GR1
SUBA GR1,=1
CPA GR1,=0
JZE FIN

CALL SAIKI

FIN
ADDA GR2,GR1

RET

KAZU DS 1
TASU DC ‘+’
LEN DC 2
END

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

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

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

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

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

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

<<関連記事>>

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

アセンブラ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月)合格報告