アセンブラ過去問プログラミング
アセンブラ自作サンプルへ
基本情報技術者試験トップへ
息抜きに、写真で癒し(=^・^=)
シミュレーターと過去問を解くまでの勉強に使った参考書はこちらです
令和2年度から比重が多くなる言語で、悪戦苦闘しておりますが、今日解いた過去問は、比較的易しくて正直ホッとしました。
何故易しく感じたのかと申すと、以前解いた、平成21年秋過去問アセンブラ問12と非常に似ていたからです。
なので、この記事を書き終えたら後手後手になっている年末調整の書類に取り掛かれそうです。うちの会社年末調整の締め切りが11月2×日までです。といった全然関係無い話は置いておいて(というと、志村けんさんの「こっちへ置いといて…といって持ってくるコントを思い出す」。
こんなこと書いていたら今読んでいる方に突っ込まれるかな( ´艸`))、
ではでは、アセンブラのお話しに移ります。
この問題は、平成21年秋の過去問と同じように、ビット列の指定の部分を別のビット列に置換します。よくあるパターンなのかな???
試験問題の図1に、イラストが描いてありますね。
これを私が分かるように下記のようにノートにまとめました。
字が汚くて大変恐縮ですが、宜しかったらお目汚しに見てやってください(=^・^=)m
ビット列を置き換える所を黒丸で塗りつぶしています。
これも良くあるパターンの様ですが、GR1が対象ビットの先頭アドレスを指していますね。そして、置換開始位置pがGR2、対象ビットの長さqがGR3です。
元のビット列αですが、この具体例は載っていなかったので、ベタですが、
1語目も2語目も「0101010101010101」、16進数で#5555にしたいと思います。
問題を解く前に、ざっと(選択肢はちょっと重めに見て)この問12を見てみると下記のポイントに気づきました。
・設問2の具体例をトレースに利用するとラク
・ビット置換の問題はMASKの生成が好きみたい。特に「算術」右シフト!!!!!
・14行目のレジスタGR4とGR6が設問2で問われるから良く見ておこう!
・16行目と17行目の別の表現もあるんだ…。
・やっぱりアセンブラって、シフト好きだね。
という特徴を掴みかけました。
まだまだ未熟な学習過程ながら、今日気づけましたので記事にしました。
以上を踏まえて、汚いノートをご覧下さい( ;∀;)
では、プログラミングをして、実際にシミュレーターを動かして見ます。
主記憶にα2語、対象位置のp=12、対象ビット長の10、βに置換するビット列が入りました。αのアドレスは少し見辛いですが、左寄りに見ると、この環境では「#1020」です。
GR1にαのアドレスが入りました。(#1020の2進数表記)
GR2に置換対象位置のp=12が入りました。
GR3に置換ビット長の長さq=10が入りました。
置換する文字列、βの#D6C0の2進数表記で入りました。
プログラム1「BREP」が呼び出されました。
GR4にβが退避されました。
これは、置換するビット長10文字のうちの最初の4ビット用に使います。
GR5にβが退避されました。
これは、置換するビット長10文字のうちの残りの6ビット用に使います。
GR6にマスク生成に使う#8000が入りました。・・・空欄a
この問題は、ビット列αの一部をβに置き換えます。
なので、置き換える所を0にして置換するビット列をぶち込むように
色々準備が必要で、そのうちの1つだと以前の似たような過去問を解いた時に覚えました。
GR3が1減算され、10から9になりました。
これは何をしているのかというと、詳細は後述しますが、これもマスク生成の準備に必要な処理です。
GR6にマスクが入りました。
先頭の10ビットに1が入っています。これを作りたかったのですね。
シフトは算術シフトです。
午前でやったことが役に立ちました。
算術シフトなので、空いたビットには先頭ビットと同じビット、
この場合は「1」が入ります。9ビット右にシフトすることで、
先頭から10ビット、つまりビット長の分だけ1が入ります。
なんか、アセンブラのトリビアの泉みたいな話だと思いました。
マスクが2語目用に退避されました。
GR3に16が読み込まれました。アセンブラのレジスタは1語に16ビット格納するから、
それを後にビット開始位置調整に使うからの様です。
GR3に16からGR2の12が引かれて4が入りました。
これは置換処理のビット位置調整に使います。
最初の語の置換用に右に12ビットシフトされました。・・・空欄c
2語目の置換用に左に4ビットシフトされました。
1語目用に12ビット右シフトされました。・・・空欄d及び設問3
2語目用に4ビット左シフトされました。
元のビット列が読み込まれました。・・・設問3
マスクが排他的論理和XORで反転しました。
元のビット列αの、置換対象の部分がゼロクリアされました。
後にここに置換に使うβをぶち込みます。
ORで置換処理が実行されました。・・・空欄b及び設問3
主記憶のαの先頭に置換後のビット列が格納されました。
GR2にαの2語目が読み込まれました。
GR7のマスクが排他的論理和で反転しました。
GR2の置換対象部分に当たる所がゼロクリアされました。
ORで置換処理が実行されました。・・・空欄b
主記憶のαの先頭+1である2語目に置換後のビット列が格納されました。
ここまでで設問1、2、3が終わりました。
以下がプログラム1と、それを呼び出すのに使ったMAINです。
それとノートです。
;平成25年春プログラム1を含む設問1、2、3
;メインプログラム
MAIN START
RPUSH
LAD GR1,ALPHA ;αの設定
LD GR2,P ;置換開始位置の設定
LD GR3,Q ;置換対象文字長の設定
LD GR0,BETA ;βの設定
CALL BREP ;プログラム1を呼び出す
RPOP
RET
ALPHA DC #5555 ;問題文の具体例に沿ったデータを配置
DC #5555
P DC 12
Q DC 10
BETA DC #D6C0
;[プログラム1]の「BREP」のはじまりはじまり~~~~(^O^)/
BREP RPUSH
LD GR4,GR0 ;βを退避(10ビット中の最初の4ビット用)
LD GR5,GR0 ;βを退避(10ビット中の残りの4ビット用)
LD GR6,=#8000 ;MASKパターン生成の準備(7行目の「算術」シフト用)
LAD GR3,-1,GR3 ;MASKパターン生成の準備その2(シフトするビット数用)
SRA GR6,0,GR3 ;GR6←qビットのMASKパターン生成(くどいようですが「算術」シフト)
;「算術」シフトということは空いた所が1なら1が入るって午前対策でやった。
LD GR7,GR6 ;生成したマスクを後半6ビット用に読み込み
LD GR3,=16 ;開始位置を合わせる準備
SUBA GR3,GR2 ;GR3←16-p
SRL GR4,0,GR2 ;1語目用置換文字列の準備
SLL GR5,0,GR3 ;2語目用置換文字列の準備
SRL GR6,0,GR2 ;1語目用MASKパターン生成
SLL GR7,0,GR3 ;2語目用MASKパターン生成
LD GR2,0,GR1 ;1語目の処理
XOR GR6,=#FFFF ;置換用にビットを反転する
AND GR2,GR6 ;置換対象の所をゼロにして置く
OR GR2,GR4 ;↑でゼロにした所に置換対象の部分をぶち込む
ST GR2,0,GR1 ;置換後のビット列をαの1語目に格納する
LD GR2,1,GR1 ;2語目の処理
XOR GR7,=#FFFF ;置換用にビットを反転する
AND GR2,GR7 ;置換対象の所をゼロにして置く
OR GR2,GR5 ;↑でゼロにした所に置換対象の部分をぶち込む
ST GR2,1,GR1 ;置換後のビット列をαの2語目に格納する
RPOP
RET
END
では、設問4用にノートも用いて行います。
もっと長いビット列αも対応したいんだよ!!!っていう訳で追加のプログラムの様ですね。ちょっと疲れましたが、もう少し頑張ります。
すみません、深呼吸します。
・・・落ち着いた所で、設問4に入ります。
具体例として、n=4、4語分用意して、その中の3語目(α+2)と4語目を置換対象にしました。
αの置換開始位置をp=44です。(16+16+上記の設問と同じ12ビット)
qは同じで10にします。
では、ノートです。
では、プログラム2のトレースを行います。
主記憶で、αの領域を設問4用に多く(4語)場所取りしました。
GR2にビット開始の位置44が入りました。
ビット位置と指し示す語の位置の調整の為、GR7にp=44のビット開始位置が退避されました。
ビット位置44の44は00000000「0010」1100で、
「0010」を右端にシフトすることによって、3語目(α+2)を指すように調整しています。
これで、αの指し示す位置が2語先になりました。
ビット位置44の000000000010「1100」の「」の所のみにしたいので、
000Fとの論理積ANDを取りました。
ここからプログラム1のBREPを呼び出します。
重複する所は省いて、設問4に関係のある所のみを掲載します。
最初の置換ビット列がα+2の位置に格納されました。
最初の置換ビット列がα+3の位置に格納されました。
最後に、プログラム2を掲載します。
;平成25年春プログラム2及び1を含む設問4
;メインプログラム
MAIN START
RPUSH
LAD GR1,ALPHA ;αの設定
LD GR2,P ;置換開始位置の設定。設問4用。
LD GR3,Q ;置換対象文字長の設定
LD GR0,BETA ;βの設定
CALL XBREP ;プログラム2を呼び出す
RPOP
RET
ALPHA DC #5555 ;問題文の具体例に沿ったデータを配置
DC #5555
DC #5555 ;設問4用にαを追加(α+2)
DC #5555 ;設問4用にαを追加(α+3)
P DC 44 ;設問4用に3語目~4語目の先頭を0とした44ビットにする
Q DC 10
BETA DC #D6C0
;[プログラム2]の「XBREP」です(=^・^=)m
XBREP RPUSH
LD GR7,GR2 ;3語目を指し示すようにする
SRL GR7,4 ;α+2の2を作る為にシフトする
ADDL GR1,GR7 ;α+2にする
AND GR2,=#000F ;44の下位ビットを取り出す
CALL BREP ;プログラム1を呼び出す
RPOP
RET
;[プログラム1]の「BREP」のはじまりはじまり~~~~(^O^)/
BREP RPUSH
LD GR4,GR0 ;βを退避(10ビット中の最初の4ビット用)
LD GR5,GR0 ;βを退避(10ビット中の残りの4ビット用)
LD GR6,=#8000 ;MASKパターン生成の準備(7行目の「算術」シフト用)
LAD GR3,-1,GR3 ;MASKパターン生成の準備その2(シフトするビット数用)
SRA GR6,0,GR3 ;GR6←qビットのMASKパターン生成(くどいようですが「算術」シフト)
;「算術」シフトということは空いた所が1なら1が入るって午前対策でやった。
LD GR7,GR6 ;生成したマスクを後半6ビット用に読み込み
LD GR3,=16 ;開始位置を合わせる準備
SUBA GR3,GR2 ;GR3←16-p
SRL GR4,0,GR2 ;1語目用置換文字列の準備
SLL GR5,0,GR3 ;2語目用置換文字列の準備
SRL GR6,0,GR2 ;1語目用MASKパターン生成
SLL GR7,0,GR3 ;2語目用MASKパターン生成
LD GR2,0,GR1 ;1語目の処理
XOR GR6,=#FFFF ;置換用にビットを反転する
AND GR2,GR6 ;置換対象の所をゼロにして置く
OR GR2,GR4 ;↑でゼロにした所に置換対象の部分をぶち込む
ST GR2,0,GR1 ;置換後のビット列をαの1語目に格納する
LD GR2,1,GR1 ;2語目の処理
XOR GR7,=#FFFF ;置換用にビットを反転する
AND GR2,GR7 ;置換対象の所をゼロにして置く
OR GR2,GR5 ;↑でゼロにした所に置換対象の部分をぶち込む
ST GR2,1,GR1 ;置換後のビット列をαの2語目に格納する
RPOP
RET
END
今度受けるので、自分の勉強になりました。
どなたかのお役に立てたらうれしいです。
この記事を書くのに6時間かかったので、
誰も見ていなかったら泣いちゃいます( ;∀;)
どなたか見ている人いますか?いたら手を振って下さい(=^・^=)
要領悪すぎにゃ~~~~~~( ;∀;)(=^・^=)( ;∀;) (^O^)/
今回は、今までの記事と違って、下らないことも色々書いて失礼もあったかもしれませんが、ここまでお付き合い頂き、誠にありがとうございました。
あ、年末調整頑張ります!!