令和元年度 秋期 基本情報技術者試験(午後)問12 ソフトウェア開発(アセンブラ)の解き方

1 問題の解き方

午後問題は11問出題され、その中から5問を解答します。
分野 配点
1 情報セキュリティ 必須 20点
2~5 午前試験問題の応用 2問選択 各15点
6 アルゴリズム 必須 25点
7~11 各種言語 1問選択 25点
note
合格基準は60点
問1~5は午前向け試験対策で得点できます。ここで少なくとも7~8割(35~40点)得点し、問6~11の各問題で5~6割(25~30点)得点することを目指します。
アセンブラ問題の場合、プログラム全体を理解することなく、穴埋め部分周辺だけの解析で解ける問題があります。はじめにこれらの問題を解答し、次に、解析範囲を広げて解いていきます。
令和元年秋期問題の場合、穴埋め部分周辺だけの解析で、5割(8問中4問)を正解できます。
  • 正解できる問題:1-a、1-b、3-g、3-h
  • 絞り込みできる問題:2-d、2-e
  • 幅広い解析を要する問題:1-c、2-f
穴埋め部分周辺だけの解析方法
  1. コメントに着目し、解答群から正解を絞り込む。
  2. 前後の命令に着目し、解答群から正解を絞り込む。
  3. 解答群の命令に着目し、解答群から正解を絞り込む。

2 問題を解く1

穴埋め箇所周辺だけの解析で解答できる問題があります。 まず、穴埋め箇所周辺だけを解析して解答します。

2.1 設問1

1 - a

穴埋め個所
6         [  a  ]
7         ST   GR1,RESULT ;符号部を退避
解答群
ア AND GR1,=#000F
イ AND GR1,=#F000
ウ AND GR1,=#FFFF
エ OR  GR1,=#000F
オ OR  GR1,=#F000
カ OR  GR1,=#FFFF
解答手順
コメントに着目
  1. 「符号部を退避」のコメントに着目します。
  2. 解答群の中から、「符号部」に対して操作する命令を選びます。
    ⇒「ア」と「エ」が該当します。
  3. 「ア」と「エ」の「符号部」に対する操作内容を検証します。
    ⇒「エ」は「符号部」を破壊("F"で上書き)してるので除外されます。
  4. 「ア」の操作内容を確認します。
    ⇒「ア」は「符号部」以外を0クリアし、「符号部」を抽出しています。
  5. 正解は「ア」となります。
解答群解説
各選択肢の命令は、GR1を以下のように操作しています。
「数値部(上位12ビット)」を0クリアし、「符号部」を抽出します。
「符号部」に固定値("#0")を設定し、「符号部」を破壊します。
GR1の内容は変化しません。無駄な操作です。
「符号部」に固定値("#F")を設定し、「符号部」を破壊します。
100桁の位置に固定値("#F")を設定します。無意味な操作です。
「符号部」に固定値("#F")を設定し、「符号部」を破壊します。

1 - b

穴埋め個所
15         ADDL GR1,GR2
16         CPL  GR1,=10    ;10以上の場合は桁上げ
17         [  b  ]
18         SUBL GR1,=10
20  MERGE
解答群
ア JMI MERGE
イ JNZ MERGE
ウ JPL MERGE
エ JOV MERGE
オ JZE MERGE
解答手順
コメントに着目
  1. 「10以上の場合は桁上げ」のコメントに着目します。
  2. 解答群から"10以上""10未満"で処理を分岐できる命令を捜します。
    ⇒「ア」が該当します。
  3. 「ア」の操作内容を確認します。
    ⇒「ア」は"10未満"で分岐し、"10以上"で分岐しません。
  4. 正解は「ア」となります。
解答群解説
各選択肢の命令は、以下の条件で分岐します。
"(GR1 - 10) < 0"で分岐します。
すなわち、"GR1 < 10"で分岐します。"GR1 >= 10"で分岐せず。
"(GR1 - 10) ≠ 0"で分岐します。
すなわち、"GR1 ≠ 10"で分岐します。
"(GR1 - 10) > 0"で分岐します。
すなわち、"GR1 > 10"で分岐します。
比較命令ではフラグレジスタのOFは設定されません。
すなわち、常に、分岐しません。
"(GR1 - 10) = 0"で分岐します。
すなわち、"GR1 = 10"で分岐します。
point
"CPL"命令は内部で"GR1 - 10"の演算を行いその結果をフラグレジスタに反映します。 ("OF"には常に"0"が設定されます。JOVで分岐しません。)

1 - c

穴埋め個所
19         LAD  GR0,1
20  MERGE  [  c  ]
21         OR   GR1,RESULT ;中間結果との併合
解答群
ア SLA GR1,0,GR3
イ SLL GR1,0,GR3
ウ SLL GR1,=4
エ SRA GR1,0,GR3
オ SRL GR1,0,GR3
カ SRL GR1,=4
解答手順
コメントに着目
  1. 「中間結果との併合」のコメントに着目します。
    ⇒ヒントなし
前後の命令に着目
  1. 前後の数ステップを解析します。
    ⇒ヒントなし
解答群の命令に着目
  1. 解答群を確認します。
    ⇒シフト方法を解いていることが解りますが、絞り込むためのヒントなし
解答群解説
各選択肢の命令は、GR1を以下のように操作しています。
左方向に算術シフト。シフト量はGR3です。
左方向に論理シフト。シフト量はGR3です。
左方向に論理シフト。シフト量は4です。
右方向に算術シフト。シフト量はGR3です。
右方向に論理シフト。シフト量はGR3です。
右方向に論理シフト。シフト量は4です。

2.2 設問2

2 - d

穴埋め個所
3         CPL  GR1,GR2
4         [  d  ]
5         LD   GR4,GR1
6         LD   GR1,GR2
7         LD   GR2,GR4
8  INI    
解答群
ア JMI INI
イ JNZ INI
ウ JOV INI
エ JPL INI
オ JZE INI
解答手順
前後の命令に着目 {-}
  1. 解答群の命令は、いずれもINIへの分岐命令ですので、分岐しない時の処理内容(行番号4~7)を確認します。
    ⇒行番号4~7ではGR1とGR2の入れ替え行っています。
解答群の命令に着目 {-}
  1. 解答群から各命令を適用した場合の動作を確認します。(解答群解説参照)
    ⇒「ア」と「エ」に絞り込まれます。
  2. さらなる絞り込みは難しいので、次問に着手します。
解答群解説
各選択肢の命令実行で分岐しなかった時の処理を検証します。
"GR1 < GR2"の時に"INI"に分岐
"GR1 >= GR2"の時に分岐せず、GR1とGR2の入れ替えが実行され、"GR1 <= GR2"となります。
"GR1 ≠ GR2"の時に"INI"に分岐
"GR1 = GR2"の時に分岐せず、GR1とGR2の入れ替えが実行されます。 入れ替えを行っても"GR1 = GR2"の状態は変化しないので、本命令は無駄な処理となります。
比較命令では、OFには常に0が設定されます。
常に分岐しないので、本分岐命令は無駄な処理となります。
"GR1 > GR2"の時に"INI"に分岐
"GR1 <= GR2"の時に分岐せず、GR1とGR2の入れ替えが実行され、"GR1 >= GR2"となります。
"GR1 = GR2"の時に"INI"に分岐
"GR1 ≠ GR2"の時に分岐せず、GR1とGR2の入れ替えが実行されます。 入れ替えを行っても"GR1 ≠ GR2"の状態は変化しないので、本命令は無駄な処理となります。

2 - e

穴埋め個所
20         SUBL GR1,GR2
21         JPL  MERGE
22         [  e  ]
23         ADDL GR1,=1O
24         LAD  GRO,1
25  MERGE
解答群
ア JMI MERGE
イ JNZ MERGE
ウ JOV MERGE
エ JZE MERGE
オ SLL GR1,0,GR3
カ SRL GR1,0,GR3
解答手順
解答群の命令に着目
  1. 解答群から各命令を適用した場合の動作を確認します。(解答群解説参照)
    ⇒「ア」~「ウ」は同じ動作結果("GR1 = GR2"の時分岐せず)となるので除外されます。
  2. さらなる絞り込みは難しいので、次問に着手します。
解答群解説
各選択肢の命令を実施すると、以下のように処理されます。 1ステップ前の"JPL MERGE"と合わせて確認します。
"GR1 - GR2"の結果が正および負の時に分岐。 "GR1 = GR2"の時分岐せず。
"GR1 - GR2"の結果が正および0以外の時に分岐。 "GR1 = GR2"の時分岐せず。
"GR1 - GR2"の結果が正および負(0~65535範囲外)の時に分岐。 "GR1 = GR2"の時分岐せず。
"GR1 - GR2"の結果が正および0の時に分岐。"GR1 < GR2"の時分岐せず。
"GR1 - GR2"の結果が正の時に、左シフトし10加算。
"GR1 - GR2"の結果が正の時に、右シフトし10加算。

2 - f

穴埋め個所
31         LD   GR1,A
32         SRL  GR1,0,GR3
33         LD   GR2,B
34         SRL  GR2,0,GR3
35         [  f  ]
解答群
ア ADDA GR1,GR0
イ ADDL GR1,=1
ウ ADDL GR1,GR0
エ ADDL GR3,GR0
オ SUBL GR1,=1
カ SUBL GR1,GR0
解答手順
解答群の命令に着目
  1. 解答群から各命令を適用した場合の動作を確認します。(解答群解説参照)
    ⇒解答群からの絞り込みは難しいようです。
  2. さらなる絞り込みは難しいので、次問に着手します。
解答群解説
各選択肢の命令は、GR1を以下のように操作しています。
GR1 ← GR1 + GR0
GR1 ← GR1 + 1
GR1 ← GR1 + GR0
GR3 ← GR3 + GR0
GR1 ← GR1 - 1
GR1 ← GR1 - GR0

2.3 設問3

3 - g

穴埋め個所
2         LD   GR0,GR1
3         [  g  ]
4         SRL  GR0,1
5         [  h  ]
6         CALL ADDP1
7         JUMP FIN
8  P2     CALL ADDP2
解答群
ア ADDL GR1,=1
イ AND  GR0,GR2
ウ OR   GR1,GR2
エ SUBL GR1,=1
オ XOR  GR0,GR2
解答手順
前後の命令に着目
  1. 前後の命令では、GR2を参照していません。GR1とGR2の符号を比較するのであれば、GR2を参照する必要があります。
    ⇒GR2を参照する「イ」「ウ」「オ」に限定されます。
  2. 1ステップ後でGR0を操作しています。
    ⇒GR0を操作している「イ」と「オ」の可能性が高いようです。
  3. 「イ」と「オ」の実施結果を確認します。
    「イ」の場合の実施結果
    • 正+正の場合:"???C and ???C ⇒ ???C"
    • 正+負の場合:"???C and ???D ⇒ ???C"
    • 負+負の場合:"???D and ???D ⇒ ???D"
    「オ」の場合の実施結果
    • 正+正の場合:"???C xor ???C ⇒ ???0"
    • 正+負の場合:"???C xor ???D ⇒ ???1"
    • 負+負の場合:"???D xor ???D ⇒ ???0"
    「オ」の操作を実施することで、最下位ビットを参照することで判断(符号の差異)できることが解ります。
  4. 正解は「オ」となります。
解答群解説
各選択肢の命令を実施すると、以下のように処理されます。
入力された値の一方の「符号部」に1、加算されます。
数値部は変化しません。 符号部は、以下のように変化します。
"C+1 → D""D+1 → E"
入力された二つの値をANDします。
数値部の結果は不定です。 符号部は、以下のように変化します。
"C and C → C""C and D → C""D and D → D"
入力された二つの値をORします。
数値部の結果は不定です。 符号部は、以下のように変化します。
"C or C → C""C or D → D""D or D → D"
入力された値の一方の「符号部」から1、減算します。
数値部は変化しません。 符号部は、以下のように変化します。
"C-1 → B""D-1 → C"
入力された二つの値をXORします。
数値部の結果は不定です。 符号部は、以下のように変化します。
"C xor C → 0""C xor D → 1""D xor D → 0"
同じ符号なら0になり、異なる符号なら1になります。

3 - h

穴埋め個所
2         LD   GR0,GR1
3        [XOR  GR0,GR2]
4         SRL  GR0,1
5         [  h  ]
6         CALL ADDP1
7         JUMP FIN
8  P2     CALL ADDP2
解答群
ア JMI P2
イ JNZ P2
ウ JOV P2
エ JPL P2
オ JZE P2
解答手順
前後の命令に着目
  1. "XOR GR0,GR2"によって、符号が同じなら、最下位ビットが"0"となります。 符号が異なれば、最下位ビットが"1"となります。
    "SRL GR0,1"によって、最下位ビットがフラグレジスタの"OF"に反映されます。 「ウ」は、フラグレジスタの"OF"の状態によって、分岐を制御できます。
  2. 正解は「ウ」となります。
解答群の命令に着目
  1. 解答群から各命令を適用した場合の動作を確認します。(解答群解説参照)
    ⇒「ウ」以外、不適切な命令です。
  2. 正解は「ウ」となります。
解答群解説
行番号4は右方向の論理シフトなので、結果がマイナスになることはなく、常に分岐せず不適当です。
数値部は不定です。この分岐命令は数値部の影響も受けてしまうため不適当です。
(数値部が0でない時、常に分岐します。)
シフト命令によって、最下位ビットがフラグレジスタのOFに反映されます。
フラグレジスタのOFがONの時に分岐します。
数値部は不定です。この分岐命令は数値部の影響も受けてしまうため不適当です。
数値部が0でない時、常に分岐します。
数値部は不定です。この分岐命令は数値部の影響も受けてしまうため不適当です。
数値部が0でない時、常に分岐しません。

3 問題を解く2

3.1 設問1

1 - c

解答群
ア SLA GR1,0,GR3
イ SLL GR1,0,GR3
ウ SLL GR1,=4
エ SRA GR1,0,GR3
オ SRL GR1,0,GR3
カ SRL GR1,=4

解答群絞り込み

  1. [ c ]の次に“GR1 ← GR1 or RESULT”の処理が行われています。 GR1の最下位4ビットには加算結果が格納されています。 RESULTの最下位4ビットには符号が格納されています。 ⇒ “GR1 ← GR1 or RESULT”を実行すると加算結果が消失してしまいます。
  2. “GR1 ← GR1 or RESULT”前に右方向のシフトを行っても加算結果が消失してしまいます。 ⇒ 「エ」~「カ」は除外されます。
note
行番号11や行番号27に"SRL GR1,0,GR3"の処理があるので、同じ論理シフトでシフト量がGR3である「イ」を選択しても良いかもしれません。
  1. ループごとに"LAD GR3,4,GR3"でシフト量を+4することで、計算桁を、一桁→十桁→百桁と変えていきます。
  2. "OR GR1,RESULT"で中間結果と併合するにあたっては、GR1を左シフトします。 左シフト量が4固定では、一桁と十桁と百桁の計算結果が同じ場所に書き込まれてしまいます。 ⇒「ウ」が除外されます。
  3. 百桁の加算行った場合、12ビットのシフトが行われ、最上位4ビットにデータが格納されます。
    ⇒「ア」の算術シフトでは汎用レジスタの最上位ビットは変化しませんので、8より大きな数を表現できません。 ⇒「ア」が除外されます。
  4. 「イ」に絞り込まれます。

本プログラムの概要

本プログラムの概要は以下のとおりです。(本プログラムの詳細は、XXを参照してください。)
  1. 二つの入力値を退避
  2. シフト量(GR3) ← 4
  3. 計算結果域にGR1の符号格納(RESULT ← GR1 and #000F)
  4. 退避域から入力値を取出す
  5. 入力値を右シフト(シフト量はGR3)
  6. 下位4ビットを取り出す(GR1 ← GR1 and #000F)
  7. 桁上がり(GR0) ← 0
  8. 加算実施
  9. 結果が10以上なら、10減算(上位桁に10繰り上げ)し、桁上がり(GR0) ← 1
  10. [ c ]
  11. GR1に以前の計算結果を反映(GR1 ← GR1 or RESULT)
  12. シフト量(GR3) ← GR3 + 4
  13. 100桁の計算完了?計算完了なら復帰値作成へ
  14. 計算結果域に「計算結果+符号(GR1)」を格納
  15. 退避域から入力値を取出す
  16. 入力値を右シフト(シフト量はGR3) 計算対象桁を下位4ビットに設定
  17. 桁上がり反映(GR1 ← GR1 + GR0)
  18. 6.へ
  19. 復帰値作成
  20. 復帰

3.2 設問2

2 - d

解答群
ア JMI INI
エ JPL INI
note
既に「ア」と「エ」に絞り込まれています。

解答群絞り込み

  1. "GR1 - GR2"の計算を行っていること。」から、GR1の方が大きくなるように入れ替えを行っているものと推測されます。この推測が正しければ、正解は「エ」になります。
推定される減算方法は、以下の計算を行います。
  • 絶対値で大きい方から小さい方を減算する。
  • 絶対値の大きい方の符号が計算の符号とする。
トレースを実施すると、以下のことが解ります。
  • 百桁の減算を行った際に桁下がり処理が行われていない。
  • GR1から抽出した符号を計算結果の符号としている。 このことから、推定された減算方法で計算されていることが解ります。

本プログラムの概要

本プログラムの概要は以下のとおりです。(本プログラムの詳細は、XXを参照してください。)
  1. 二つの入力値の大小関係を比較
  2. [ d ]の時、二つの入力値を入れ替える
  3. 二つの入力値を退避
  4. シフト量(GR3) ← 4
  5. 計算結果域にGR1の符号格納(RESULT ← GR1 and #000F)
  6. 退避域から入力値を取出す
  7. 入力値を右シフト(シフト量はGR3)
  8. 下位4ビットを取り出す(GR1 ← GR1 and #000F)
  9. 桁下がり(GR0) ← 0
  10. 減算実施
  11. [ e ]の時、桁下がり処理スキップ
  12. 結果が負なら、10加算(上位桁から10を取り出す)し、桁下がり(GR0) ← 1
  13. 右シフトした値を元の位置にもどす(左シフト)(シフト量はGR3)
  14. GR1に以前の計算結果を反映(GR1 ← GR1 or RESULT)
  15. シフト量(GR3) ← GR3 + 4
  16. 100桁の計算完了?計算完了なら復帰値作成へ
  17. 計算結果域に「計算結果+符号(GR1)」を格納
  18. 退避域から入力値を取出す
  19. 入力値を右シフト(シフト量はGR3) 計算対象桁を下位4ビットに設定
  20. [ f ]
  21. 8.へ
  22. 復帰値作成(計算結果が“-0”なら“+0”に変更する)
  23. 復帰

2 - e

解答群
エ JZE MERGE
オ SLL GR1,0,GR3
カ SRL GR1,0,GR3
note
既に「エ」~「カ」に絞り込まれています。

解答群絞り込み

  1. プログラム1では当該箇所で加算処理を行っています。 この時、加算結果が10以上時に桁上げ処理を行っています。
  2. プログラム2の当該箇所で減算を行っています。 減算ではマイナス時に桁下げ処理が必要になります。 ⇒ 減算結果がプラスやゼロの時、桁下げが不要です。 ⇒ 「エ」の時、減算結果がゼロの時、桁下げ処理がスキップされます。

2 - f

解答群
ア ADDA GR1,GR0
イ ADDL GR1,=1
ウ ADDL GR1,GR0
エ ADDL GR3,GR0
オ SUBL GR1,=1
カ SUBL GR1,GR0

解答群絞り込み

  1. プログラム1では当該箇所で桁上げを行っています。
  2. プログラム2の当該箇所では桁下げ処理が必要になります。 ⇒ 減算結果がプラスやゼロの時、桁下げが不要です。 ⇒ 「カ」の時、桁下げ処理が実行されます。

プログラムの不具合

以下の場合、プログラムは正しく動作しません。(出題ミス) SUBL GR1,GR0実行時に、GR1が"0``の時、桁下がり処理が必要ですが実装されていません。 (例:“100 - 001”`を実行した場合、正しく計算されません。)
解答群解説
各選択肢の命令は、GR1を以下のように操作しています。
GR1 ← GR1 + GR0 (算術加算) 桁下げ発生時に、上位桁を+1します。正しい計算ではありません。
GR1 ← GR1 + 1 (論理加算) 桁下げ発生有無に関わらず無条件に、+1します。正しい計算ではありません。
GR1 ← GR1 + GR0 (論理加算) 桁下げ発生時に、+1します。正しい計算ではありません。
GR3 ← GR3 + GR0 (論理加算) シフト量を加算しています。
GR1 ← GR1 - 1 (論理減算) 桁下げ発生有無に関わらず無条件に、-1します。正しい計算ではありません。
GR1 ← GR1 - GR0 (論理減算) 桁下げ発生時に、-1します。正しい計算ではありません。

4 プログラム解説

4.1 設問1

プログラム1の説明

仕様は以下のとおりです。
  • 符号の同じ10進数加算プログラム。
  • 図1のように各桁は4ビットで表現。
  • 上位12ビットで3桁の数を表現(以降、数値部と呼ぶ)。
  • 下位4ビットは符号(以降、符号部と呼ぶ)。
  • 入力はGR1とGR2、出力はGR0。

プログラム1

 1  ADDP1  START
 2         RPUSH
 3         ST   GR1,A      ;GR1をAに退避
 4         ST   GR2,B      ;GR2をBに退避
 5         LAD  GR3,4      ;シフト数4設定(符号部シフト量)
 6        [AND  GR1,=#000F];符号部の抽出
 7         ST   GR1,RESULT ;符号部を退避
8         LD   GR1,A      ;GR1復元
9         SRL  GR1,0,GR3  ;1桁目を下位4ビットに設定
10         LD   GR2,B      ;GR2復元
11         SRL  GR2,0,GR3  ;1桁目を下位4ビットに設定
12  L00P   AND  GR1,=#000F ;計算対象桁以外をクリア
13         AND  GR2,=#000F ;計算対象桁以外をクリア
14         LAD  GR0,0      ;桁上がりフラグクリア
15         ADDL GR1,GR2    ;加算
16         CPL  GR1,=10    ;10以上の場合は桁上げ
17        [JMI  MERGE]     ;10未満時分岐
18         SUBL GR1,=10    ;10以上時10減算
19         LAD  GR0,1      ;桁上がりフラグセット
20  MERGE [SLL  GR1,0,GR3] ;計算対象桁を元の位置に復元
21         OR   GR1,RESULT ;中間結果との併合
22         LAD  GR3,4,GR3  ;シフト量更新
23         CPL  GR3,=16    ;100桁まで計算完了?
24         JZE  FIN        ;終了判定
25         ST   GR1,RESULT ;中間結果を退避
26         LD   GR1,A      ;GR1復元
27         SRL  GR1,0,GR3  ;計算対象桁を下位4ビットに設定
28         LD   GR2,B      ;GR2復元
29         SRL  GR2,0,GR3  ;計算対象桁を下位4ビットに設定
30         ADDL GR1,GR0    ;桁上がりフラグ反映
31         JUMP L00P
32  FIN    LD   GR0,GR1    ;計算結果を復帰値に設定
33         RP0P
34         RET
35  A      DS              ;G1退避域
36  B      DS              ;G2退避域
37  RESULT DS              ;計算結果退避域
38         END

4.2 設問2

プログラム2の説明

仕様は以下のとおりです。
  • 符号の異なる10進数加算プログラム。

プログラム2

 1  ADDP2  START
 2         RPUSH
3         CPL  GR1,GR2   ;二つの入力値の大小関係比較
4        [JPL  INI]      ;GR1 > GR2なら分岐
5         LD   GR4,GR1   ;G1,G2入れ替え
6         LD   GR1,GR2
7         LD   GR2,GR4
 8  INI    ST   GR1,A      ;GR1をAに退避
 9         ST   GR2,B      ;GR2をBに退避
10         LAD  GR3,4      ;シフト数4設定(符号部シフト量)
11        [AND  GR1,=#000F];符号部の抽出
12         ST   GR1,RESULT ;符号部を退避
13         LD   GR1,A      ;GR1復元
14         SRL  GR1,0,GR3  ;1桁目を下位4ビットに設定
15         LD   GR2,B      ;GR2復元
16         SRL  GR2,0,GR3  ;1桁目を下位4ビットに設定
17  L00P   AND  GR1,=#000F ;計算対象桁以外をクリア
18         AND  GR2,=#000F ;計算対象桁以外をクリア
19         LAD  GR0,0      ;桁下がりフラグクリア
20         SUBL GR1,GR2    ;減算
21         JPL  MERGE      ;正時、分岐
22        [JZE  MERGE]     ;0時、分岐
23         ADDL GR1,=10    ;桁下がり時10加算
24         LAD  GR0,1      ;桁下がりフラグセット
25  MERGE [SLL  GR1,0,GR3] ;計算対象桁を元の位置に復元
26         OR   GR1,RESULT ;中間結果との併合
27         LAD  GR3,4,GR3  ;シフト量更新
28         CPL  GR3,=16    ;100桁まで計算完了?
29         JZE  FIN        ;終了判定
30         ST   GR1,RESULT ;中間結果を退避
31         LD   GR1,A      ;GR1復元
32         SRL  GR1,0,GR3  ;計算対象桁を下位4ビットに設定
33         LD   GR2,B      ;GR2復元
34         SRL  GR2,0,GR3  ;計算対象桁を下位4ビットに設定
35        [SUBL GR1,GR0]   ;桁下がりフラグ反映
36         JUMP L00P
37  FIN    LD   GR0,GR1    ;計算結果を復帰値に設定
38         CPL  GR0,=#000D ;計算開始時に絶対値の大きい方に符号設定
39         JNZ  FIN2
40         LAD  GR0,=#000C
41  FIN2   RP0P
42         RET
43  A      DS
44  B      DS
45  RESULT DS
46         END

4.3 設問3

プログラム3の説明

仕様は以下のとおりです。
  • 符号の組み合わせでプログラム1とプログラム2を呼び分けるプログラム。
  • 符号が同じなら"ADD1"実行、符号が異なるなら"ADD2"実行。
point
「符号が同じかどうかは、最下位ビットが同じかどうかで判断できます。

プログラム3

 1  ADDP   START
2         LD   GR0,GR1
3        [XOR  GR0,GR2]  ;最下位ビット差異明確化
4         SRL  GR0,1     ;最下位ビット抽出
5        [JOV  P2]       ;最下位ビット一致不一致判定
6         CALL ADDP1     ;一致時
7         JUMP FIN
8  P2     CALL ADDP2     ;不一致時
9  FIN    RET
10         END

0 件のコメント:

コメントを投稿

基本情報技術者試験 アセンブラ(CASL) 原稿 20210529

  基本情報技術者試験 アセンブラ(CASL) 簡単に5割 平成21年春期,平成21年秋期 平成21春期 平成21秋期 平成22春期 平成22秋期 平成21春期 概要 解き方 設問1-a 設問1-b 設問1-c 設問2-d...