平成22秋 問12 アセンブラ のプログラミング(コメント、トレースのノート付き)

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

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


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

この問題はビット列を反転するプログラムを使って、その語内のビットや連続したビット、ビットの部分のみの反転をします。

図によるイメージが大事だと思うので、トレースに使ったノートを設問ごとに掲載します。まずこちらのトレースに使ったノート2ページ分をご覧下さい。

設問1では、プログラム1REVRSを使って、具体例としてビット列αを
実行前:「1011001111010001」
実行後:「1000101111001101」
と反転します。

レジスタはGR1にαの先頭アドレスを設定します。
メインプログラムからREVRSを呼び出します。

それでは一つずつ丁寧にトレースしていきます。
まず、主記憶のALPHAの所に、元のビット列αが入ります。

GR1にビット列αが格納されているアドレスが入りました。

プログラム1のREVRSを呼び出します。
反転するビットの結果用につかうGR4が初期化されました。

ループカウンタに使う処理待ちビット数の15がGR2に入りました。

元のビット列がGR3に退避されました。

ループ1回目
GR4が左シフトされましたが0なので変わりません。

GR3が右シフトされました。
OFが1になって末尾が1だった為、オーバーフローしました。

オーバーフローしたのでラベル「ON」に分岐しました。

16進数「0001」である、0000000000000001を結果用のGR4に加えます。

ループカウンタをデクリメントしました。
残14

ループ2回目

結果用のGR4が左シフトされました。

元のビット列が退避されたGR3が右シフトされました。

GR2のカウンタがデクリメントされました。
残13

ループ3回目

結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。

GR2のカウンタがデクリメントされました。
残12

ループ4回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。

GR2のカウンタがデクリメントされました。
残11

ループ5回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。
OFが1になり、ONに分岐します。

結果用のGR4に1加わりました。

GR2のループカウンタがデクリメントされました。
残10

ループ6回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。

GR2のループカウンタがデクリメントされました。
残9

ループ7回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。
OFが1になり、ONに分岐します。

結果用のGR4に1加わりました。

GR2のループカウンタがデクリメントされました。
残8

ループ8回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。
OFが1になり、ONに分岐します。

結果用のGR4に1加わりました。

GR2のループカウンタがデクリメントされました。
残7

ループ9回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。
OFが1になり、ONに分岐します。

結果用のGR4に1加わりました。

GR2のループカウンタがデクリメントされました。
残6

ループ10回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。
OFが1になり、ONに分岐します。

結果用のGR4に1加わりました。

GR2のループカウンタがデクリメントされました。
残5

ループ11回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。

GR2のループカウンタがデクリメントされました。
残4

ループ12回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。

GR2のループカウンタがデクリメントされました。
残3

ループ13回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。
OFが1になり、ONに分岐します。

結果用のGR4に1加わりました。

GR2のループカウンタがデクリメントされました。
残2

ループ14回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。
OFが1になり、ONに分岐します。

結果用のGR4に1加わりました。

GR2のループカウンタがデクリメントされました。
残1

ループ15回目
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。

GR2のループカウンタがデクリメントされました。
残0

ループ16回目(最後です。)
結果用のGR4が左シフトされました。

元のビット列退避用のGR3が右シフトされました。
OFが1になり、ONに分岐します。

結果用のGR4に1加わりました。

GR2のループカウンタがデクリメントされました。
残-1

マイナスになったのでループを抜け、FIN2に飛びます。
主記憶のαに反転したビットが格納されました。

こちらがプログラム1のコードになります。
尚、「1011001111010001」は16進数にすると
「#B3D1」になりますので、そのように表記しております。

MAIN START ;メインの始まり
RPUSH
LAD GR1,ALPHA ;αの先頭アドレスをGR1に読み込む
CALL REVRS ;プログラム1を呼び出す
RPOP
RET

ALPHA DC #B3D1 ;αにビット列を格納する

REVRS ;プログラム1
RPUSH
LD GR4,=0 ;結果のビット列を初期化
LAD GR2,15 ;ループカウンタ
LD GR3,0,GR1 ;GR3←ビット列
LOOP SLL GR4,1 ;結果のビット列を左シフト
SRL GR3,1 ;元のビット列を右シフト
JOV ON ;元のビット列の末尾が1だったらONに分岐する
JZE FIN1 ;元のビット列の残りのビットはすべてゼロ
JUMP OFF ;元のビット列の末尾がゼロだった時の分岐
ON OR GR4,=#0001 ;結果のビット列に1を加える
OFF SUBA GR2,=1 ;ループカウンタをデクリメントする
JMI FIN2 ;16ビット処理済み
JUMP LOOP ;LOOPへ繰り返し処理
FIN1 SLL GR4,0,GR2 ;結果のビット列を残りのビット数だけシフト
FIN2 ST GR4,0,GR1 ;結果のビット列を元のビット列に格納(上書き)する
RPOP
RET
END

では、設問2に行きます。
連続した語の並びを逆転するプログラムです。
まずノートをご覧下さい。

例として1語目から5語目までの連続した語を交換するとします。
1語目は1、2語目は2…5語目は5とします。

それではプログラム2のトレースをします。
(プログラム1のトレースは部分的に省略して、プログラム2は丁寧にトレースをします。)

まず主記憶でαの先頭アドレスからそれぞれ、1、2、3、4、5が格納されています。

GR1、GR2にαの先頭アドレス、語数の5語が設定されました。

αの先頭のアドレスがGR3にコピーされ、語数がGR4に入りました。

語数を末尾アドレスを指し示す為の準備として1減算します。(先頭アドレスがα+0、末尾がα+4になる為)

末尾のアドレスが入りました。

ループ LOOP1 1回目
GR5に1語目の「1」が入りました。
「0000000000000001」

GR6に5語目の「5」が入りました。
「0000000000000101」

主記憶のαの末尾に「1」が格納されました。

主記憶のαの先頭に「5」が格納されました。

「α+0」が「α+1」を指し、
「α+4が「α+3」」を指しました。

ループ LOOP1 2回目
「2」がGR5のα+1に入りました。

「4」がGR6のα+3に入りました。

「2」がα+3に格納されました。

「4」がα+1に格納されました。

「α+1」が「α+2」を、
「α+3」が「α+2」を指しました。

ループを抜けて次のループに入ります。
ループ LOOP2 1回目
プログラム1のREVRSを呼び出します。
先頭アドレスα+0に格納された「5」(0000000000000101)がGR3に入りました。

GR4に反転された結果が求まりました。(1010000000000000)
(この処理は以降のトレースでは省略)

その結果が主記憶α+0に格納されました。

反転の対象の語がα+1になりました。

反転する語の処理待ちが4になりました。

ループ LOOP2 2回目
反転するビットの「4」(0000000000000100)が入りました。

反転してビットが「0010000000000000」になってα+1に格納されました。

反転の対象の語がα+2になりました。

反転する語の処理待ちが3になりました。

ループ LOOP2 3回目
反転するビットの「3」(0000000000000011)が入りました。

反転してビットが「1100000000000000」になってα+1に格納されました。

反転の対象の語がα+3になりました。

反転する語の処理待ちが2になりました。

ループ LOOP2 4回目
反転するビットの「2」(0000000000000010)が入りました。

反転してビットが「0100000000000000」になってα+1に格納されました。

反転の対象の語が末尾のα+4になりました。

反転する語の処理待ちが1になりました。

ループ LOOP2 5回目
反転するビットの「1」(0000000000000001)が入りました。

反転してビットが「0100000000000000」になってα+1に格納されました。

終了しました。

こちらがプログラム2のコードになります。


MAIN START ;メインの始まり
RPUSH
LAD GR1,ALPHA ;αの先頭アドレスをGR1に読み込む
LD GR2,=5 ;全部で5語とする
CALL LREVRS ;プログラム2を呼び出す
RPOP
RET
;αにビット列を格納する
ALPHA DC #0001 ;1語目
DC #0002 ;2語目
DC #0003 ;3語目
DC #0004 ;4語目
DC #0005 ;5語目

LREVRS
RPUSH
LD GR3,GR1 ;αの先頭アドレスを読み込む
LD GR4,GR2 ;語数を読み込む。処理待ち語数カウンタ
SUBA GR4,=1 ;末尾アドレス用に減算
JZE LOOP2 ;単語数が1だったらREVRSを呼び出す
ADDA GR4,GR1 ;末尾アドレスを指す
LOOP1 LD GR5,0,GR3 ;先頭の語から格納する
LD GR6,0,GR4 ;末尾の語から格納する
ST GR5,0,GR4 ;交換処理
ST GR6,0,GR3 ;交換処理
LAD GR3,1,GR3 ;先頭の語のアドレスに1を加える
LAD GR4,-1,GR4 ;末尾の語のアドレスに1を減じる
CPA GR3,GR4 ;交換に使うアドレスの大小を比較
JMI LOOP1 ;先頭の語の方が小さかったら繰り返し処理に戻る
LOOP2 CALL REVRS ;プログラム1を呼び出す
LAD GR1,1,GR1 ;ビットを反転するアドレスを次の語へ進める
SUBA GR2,=1 ;処理待ち語数カウンタをデクリメントする
JNZ LOOP2 ;反転する語が残っている場合は繰返しに戻る
FIN3 RPOP
RET
REVRS ;プログラム1
RPUSH
LD GR4,=0 ;結果のビット列を初期化
LAD GR2,15 ;ループカウンタ
LD GR3,0,GR1 ;GR3←ビット列
LOOP SLL GR4,1 ;結果のビット列を左シフト
SRL GR3,1 ;元のビット列を右シフト
JOV ON ;元のビット列の末尾が1だったらONに分岐する
JZE FIN1 ;元のビット列の残りのビットはすべてゼロ
JUMP OFF ;元のビット列の末尾がゼロだった時の分岐
ON OR GR4,=#0001 ;結果のビット列に1を加える
OFF SUBA GR2,=1 ;ループカウンタをデクリメントする
JMI FIN2 ;16ビット処理済み
JUMP LOOP ;LOOPへ繰り返し処理
FIN1 SLL GR4,0,GR2 ;結果のビット列を残りのビット数だけシフト
FIN2 ST GR4,0,GR1 ;結果のビット列を元のビット列に格納(上書き)する
RPOP
RET
END

では、最後に設問3に行きます。
ビット列の中のある部分のみを反転するプログラムです。
具体例として、ビット列αを
10110011「110」10001の「110」の部分を「011」と反転して、
10110011「011」10001にします。
このビット列の先頭アドレスをGR1に設定します。
pが8でqが3になり、それぞれGR2、GR3に接てします。

まずノートをご覧下さい。

では、トレースをして行きます。
GR1からGR3までの設定です。

GR4に元のビット列が入りました。

プログラム1のREVRSを呼び出します。
ビットが反転されて主記憶に格納されました。

プログラム3に戻ります。
反転されたビット列がGR5に入りました。

反転する3ビット分の調整をします。
16がGR6に入りました。

16-3で13が求まりました。

反転されたビットが8ビット分右シフトされて右端に移動しました。

反転されたビットが13ビット左にシフトされました。

反転された部分が8ビット右にシフトされました。

マスクが準備されます。#8000が入りました。

算術シフトされ、空いたビットに1が入りました。

マスクが右に8ビット移動しました。

排他的論理はでビットが反転されました。

GR4とGR6の論理積をGR6に格納しました。
GR4「1011001111010001」
GR6「1111111100011111」
AND「1011001100010001」

その演算結果に反転した部分を足しこみます。
GR6「1011001100010001」
GR5「0000000001100000」
OR 「1011001101110001」

結果をαに格納しました。

こちらがプログラム3のコードになります。

MAIN START ;メインの始まり
RPUSH
LAD GR1,ALPHA ;αの先頭アドレスをGR1に読み込む
LD GR2,=8 ;先頭を0ビットとして8ビット目から反転の対象(p)
LD GR3,=3 ;3ビット分が反転の対象(q)
CALL PREVRS ;プログラム2を呼び出す
RPOP
RET
;αにビット列を格納する
ALPHA DC #B3D1 ;1011 0011 「110」1 0001
PREVRS
RPUSH
LD GR4,0,GR1 ;ビット列を保存
CALL REVRS ;ビット列のビットの並びの逆転
LD GR5,0,GR1 ;GR5←逆転したビット列
LD GR6 ,=16
SUBA GR6,GR3 ;GR6←16-q
SRL GR5,0,GR2 ;逆転した部分ビット列αを8ビットシフトして右端に移動
SLL GR5,0,GR6 ;逆転した部分ビット列αを13ビットシフトして左端に移動
SRL GR5,0,GR2 ;逆転した部分ビット列αをpビット右に移動
LD GR6,=#8000 ;逆転に使うマスク作成の準備
SRA GR6,-1,GR3 ;算術シフトによるマスク作成
SRL GR6,0,GR2 ;マスクをpの分だけ右シフト
XOR GR6,=#FFFF ;マスクを逆転対象の3ビット分を1にする為排他的論理和を取る
AND GR6,GR4 ;元のビット列中の部分ビット列αにゼロを設定
OR GR6,GR5 ;反転した部分を足しこむ
ST GR6,0,GR1 ;結果を格納する
RPOP
RET


REVRS ;プログラム1
RPUSH
LD GR4,=0 ;結果のビット列を初期化
LAD GR2,15 ;ループカウンタ
LD GR3,0,GR1 ;GR3←ビット列
LOOP SLL GR4,1 ;結果のビット列を左シフト
SRL GR3,1 ;元のビット列を右シフト
JOV ON ;元のビット列の末尾が1だったらONに分岐する
JZE FIN1 ;元のビット列の残りのビットはすべてゼロ
JUMP OFF ;元のビット列の末尾がゼロだった時の分岐
ON OR GR4,=#0001 ;結果のビット列に1を加える
OFF SUBA GR2,=1 ;ループカウンタをデクリメントする
JMI FIN2 ;16ビット処理済み
JUMP LOOP ;LOOPへ繰り返し処理
FIN1 SLL GR4,0,GR2 ;結果のビット列を残りのビット数だけシフト
FIN2 ST GR4,0,GR1 ;結果のビット列を元のビット列に格納(上書き)する
RPOP
RET
END

今度受けるので、自分の勉強になりました。
どなたかのお役に立てたらうれしいです。
この記事を書くのに3時間以上かかったので、
誰も見ていなかったら泣いちゃいます( ;∀;)
どなたか見ている人いますか?いたら手を振って下さい(=^・^=)


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

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

平成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に演算結果が求められました。

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

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

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

C言語 文字コードで相性占い

子どもの頃、電卓を使って好きな子との相性を占いする遊びをしました。
「あ」が「1」、「い」が「2」・・・・というふうに50音と対応する数字を割り当てて、それを2り続けて行って、最初に100以下になった所が好きな人と自分との相性という、相性占いの遊びです。

これ、やったことある人いますか??

では、それをC言語を使って、文字コードでやってみたいと思います。
太郎さんの「T」、花子さんの「H」でやってみます。
標準入力する時は、「T,H」と入力します。
シフトJISコードの文字コードは、「A」を41、「B」を42・・・・として16進数で割り当てていきます。
太郎さんの「T」は「54」、花子さんの「H」は「48」です。
それを足すと「9C」になり、それを10進数で表すと「156」です。
この数字を2で割って行って、最初に100%以下になる所の数字を相性診断に使います。

こちらが太郎さんと花子さんの相性です。

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

#include <stdio.h>
int main(){


//イニシャルの文字コード用
char yourname;
char oaite;
int sum;
double aishou;

//あなたのイニシャルの文字コード
printf(“あなたのイニシャルとお相手のイニシャルを\n[,]で区切って入力してください\n例:A,B—>”);
scanf(“%c,%c”,&yourname,&oaite);

//あなたのイニシャルの文字と文字コードを表示する
printf(“あなたのイニシャル[%c]の文字コードは[%02X]です。\n\n”,yourname,yourname);

//お相手のイニシャルの文字と文字コードを表示する
printf(“お相手のイニシャル[%c]の文字コードは[%02X]です。\n\n”,oaite,oaite);

//2人のイニシャルの文字コードの合計
sum=yourname+oaite;
printf(“合算値は16進数で[%02X]で、10進数で[%d]です。\n”,sum,sum);

//相性診断
printf(“2人の相性を計算します。\n”);
aishou=sum;
while(aishou>100){
aishou/=2;
}
printf(“2人の相性は、[%.2f]パーセントです!!お幸せに!\n”,aishou);
return 0;
}

このプログラムを作るのに参考にした本です。

風呂グラミング(入浴剤紹介)

メインメニューへ
これからプログラミングをはじめる方へ
プログラミングと資格
自己紹介

この記事で紹介している入浴剤は

・入浴剤にはちょっとこだわりたい方
・頑張っている人のご褒美
・自粛疲れのリフレッシュ
・受験生
・プログラマー

に向けて、オススメ入浴剤を紹介しています。



プログラミングをやっていて困りごとは、エラーが出ること、そして、アイディアが浮かぶ時と浮かばない時があることです。
煮詰まった時には私はお風呂に入ります。

本当はパソコンを持って日本全国の温泉旅館に泊まってプログラミングと写真漬けの日々を過ごしたいのですが、流石に現実的ではありません。
では、どうしたらそれに近いことが出来るのか考えたところ、ネットで入浴剤を購入することに致しました。

プログラミングを快適に行うには健康である必要がある。
健康には風呂が大事。リラックス出来る。

という訳で、入浴剤を紹介します。

まずはこれ。

■ 北見ハッカ通商 入浴剤Sel de Menthe(セル・デ・メンタ) ■

風呂の色はマイルドでミルキーなブルーです。
ハッカの香りもマイルドなので、10月に入って肌寒くなった今の時期にも
ゆっくり温まりながらリフレッシュできます。
気分爽快なので、これはプログラマだけでなく、受験生にもおススメします(=^・^=)

この入浴剤で、北見ハッカ通商さんのファンになりました。
ハッカ油や馬油(ミントクリーム)などをこちらのページで紹介しています。
ハッカ愛からハッカー!?

続いては、本格的な入浴剤!!
■ アース製薬 温素 柚子の香り 15包 入浴剤 ■

アルカリ性のお湯でお湯の色は無色透明です。
入浴中はゆずの柔らかい香りに癒され、入力後は身体がポカポカします。
特に寒い冬の時期、冷え性、肩コリに悩む方におススメ。
アルカリ性のお湯なので、ヌルヌルっとした感じが少しあり、
湯上りはお肌が滑らかです。
プログラマは勿論、働く女性の頑張ったご褒美にも良いのかも。

■ アース製薬 アルカリ温泉成分 温素 琥珀の湯(とろさら美肌湯)600グラム ■

※浴槽がやや滑りやすくなります。
琥珀色のお湯で、植物がたっぷり入った和漢の上品な甘さのある香りがします。
トロっとした感じのアルカリ性のお湯です。
疲労回復の効果があります。
睡眠のことで悩んでいる方におススメのお風呂です。

メインメニューへ
これからプログラミングをはじめる方へ
プログラマこそストレッチ(子ども&大人向け)
自己紹介

C言語で芸能人の結婚について心の準備をしておく

石原さとみさんが一般男性の方と結婚しましたね。
私はそのことを知って、「おめでとう」、「お幸せに!!」って思います。

すみません、完全に他人ごとですよね。
もしも私が応援している推しが結婚したらどうしよう、って思ってファンとして心の準備することにいたしました。

早速、C言語を使って心の準備を致します。

配列jyunbiは5個の要素を持つchar型配列です。
要素は[0]-[4]です。この5つの中に、推しがもしも結婚したらファンとしてどうやって心の準備をしようか、
そのストックを入れます。

そして、ループで要素0から5未満(4まで)を取り出して表示させました。

実行結果です。

プログラムです。

#include <stdio.h>
int main(){


char *jyunbi[5]; //心の準備のストック用配列
//配列に準備しておくことを格納する
jyunbi[0]=”そのお相手にはプレッシャーがかかる”;
jyunbi[1]=”ファンを敵に回すかも!?”;
jyunbi[2]=”家にある推しの写真はワガハイのものにゃ”;
jyunbi[3]=”その写真を使って妄想できる”;
jyunbi[4]=”妄想をこれでもかってぐらいに爆発させる!!”;

//ループで配列の要素を取り出して表示させる
for(int i=0;i<5;i++){
printf(“%d.%s\n”,i+1,jyunbi[i]);
}

}

C言語を学んでいる方にはお子さまもいるので表現はだいぶ気を付けました。
というか抑えました。
う~~~~ん、これぐらいだったら大丈夫かな??

推しの方、いつもお世話になっております。
本当にありがとうございます。
具体的に何でお世話になっているかと申しますと、仕事しながらプログラミングや資格の勉強は、好きでやっていることとは言え集中力がぐらつくことがあります。
そういう時に好きな芸能人の方って本当に支えになるなって思うんです。

今まで体調を崩したりで勉強しか取り柄が無い私が勉強出来ずに困っていたこともあるので、自分の人生の残りの時間を全て投じてでも後れを取り戻します!!
何かお礼出来ることがあれば良いのですが、色々可能性を考えながら恩返ししたいです。

C言語メモ(設定編)

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

C言語のエディタで、Visual Studio Codeを入れたのですが、字が小さくて、老眼が入っている身にはシンドイとおもっていました。
どこでズーム出来るんだろうと悩んでいた所、左下の歯車マークをクリックして、
Setting、Commonly Usedの真ん中へんでFont Sizeの所を20にした所、老眼でも読める様になりました( ;∀;)

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

C言語メモ(エラー編)

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

C言語を始めて早速エラーのお祭りが到来しましたので、それを書き留めておこうと思います。

エディタ、コンパイラ、パスを通すといった設定を終えて初めてのhello world。
しかしdirコマンドでファイルはあるのに何故かコンパイラする時にエラーになってしまう…。
ファイルが無い?無いはずないじゃん( ;∀;)と思って、パスを通すのが出来て無かったのかも…。などと悩んでいたら、

は!!
英語力!!
の問題でした。

皆さん、間違い探しです。

Hello World
Hallo World

そりゃ、ファイルも無い訳だ。

C言語と言えば#include
これも間違い探しです。

#include <stdio.h>
#include <studio.h>

あとは、IF文の文法ミス。
もしもフラグが1の時
if(flg==1){
処理
}
とすべきところを
if(flg=1){
処理
}
としてしまいました。
なんでflgが2の時の処理が出来ないの!!って、そりゃそうだ。

代入じゃん!!
これじゃあ永遠に2の時の処理にならないって。

この記事では私がやらかした、マヌケなエラーについて書き留めます。

C言語自作サンプルメニューへ
これからプログラミングをはじめる方へ
基本情報技術者試験トップへ
息抜きに(=^・^=)写真で癒し

プログラマこそストレッチ!(子ども向けと大人向け)

メインメニューへ
これからプログラミングをはじめる方へ
プログラミングと資格
息抜きに(=^・^=)写真で癒し
自己紹介

2020年にプログラミング教育が始まってからますます大人も子供もプログラミングに熱中なのは良い事ですが、その一方で、座りっぱなしになり、腰に負担をかけてしまうこともあります。
今日は整体に行ってきました。そこでストレッチの話が出たので、YouTube動画を探して見ました。

私はラジオは東京FMを聴いていて、スイッチマンこと青山剛さんという方のことを知って、子ども向けのストレッチをやってみました。
背が伸びて足が速くなって頭も良くなるので、このストレッチをやったらキミは女の子にモテモテになるかも!?

主にこの2つの動画をやっています。

あと、今年のお盆休みに私はぎっくり腰をやってしまいました。そこで吉田先生という方のnoteと動画を見ています。

皆さま長時間座りっぱなしだと思うので、タイマーを付けて時々ストレッチやってみてください。
ぎっくり腰にはお気を付けて、快適にプログラミングを楽しんで下さい。
発達障害の過集中とも相まって座りっぱなしになりそうなので記事にしました。

プログラミングはデスクワークなので、私は40分間タイマーをかけて、ストレッチをして、腰痛の予防をしています。
一般的なキッチンタイマーですと、分をセットする時にもかなりの音が鳴りますので、私は学習用のタイマーを使って、時間になったらアラームが鳴るのみのタイマーを選びました。

プログラミングだけでなく、テレワークなどでデスクワークも増えていて腰に負担がかかるので、私は骨盤ベルトを利用しています。
「骨盤整隊カシャーン」というベルトで、巻き付けてマジックテープで止めて、両脇の調整ストラップをカシャーンと引っ張って、強力に骨盤を固定出来るので、プログラミング時の疲労が半減しました。

サイズはMとLがあります。

Mサイズ

Lサイズ

メインメニューへ
これからプログラミングをはじめる方へ
プログラミングと資格
息抜きに(=^・^=)写真で癒し
自己紹介