平成29年度春季 基本情報技術者試験(FE)の午後問題12(アセンブラ,CASL)は、64ビット符号なし整数の加算(副プログラムADD64)と副プログラムADD64を使用して、32ビット符号なし整数の乗算を行う副プログラムMUL32に関する問題でした。
設問1
空欄a
桁上がりのための処理を選択することになります。
空欄b
最下位の16ビット同士、第3位16ビット同士、第2位16ビット同士、最上位16ビット同士と加算処理が進んでいきますが、17行目の実行結果、ゼロフラグが1になれば、18行目でEXITにジャンプすることを考えると、最上位16ビットまで処理が進んだかを判定する処理を選ぶことになります。
設問2
行番号7の命令が2回目に実行されるときは、行番号11で(GR1)+3番地と(GR2)+3番地の加算をした結果#A684+#B759=#15DDDとなり、14行目でGR5が1となり、16行目でGR0が1になった状態で、7行目の処理が実行されることになります。#1+#2E0Cの結果を選択することになります。
設問3
2進数の掛け算では、以下のようになり、(A)の左シフトと加算で計算することができます。プログラム2の中で出てくるTEMPは、(A)をシフトした数を格納する役割を持っています。
1011 (A) x1010 (B) ------ 10110 TEMP 1011000 TEMP ------- 1101110
MUL32の中心的な処理は以下の所だと思います。TESTBITでは、かける数(GR0)の一番右側のビットが0の場合は、EXITLOOPへ、1の場合は、TEMPとGR3(乗算結果)を加算します。EXITLOOPでは、32ビット分の処理が終わっていればEXITへ、そうでなければTEMPを左に1ビットシフトする処理(ここでは2倍する処理で実現)が行われることになります。
TESTBIT AND GR0,=#0001 JZE EXITLOOP LD GR1,GR3 LAD GR2,TEMP CALL ADD64 EXITLOOP CPL GR5,=31 JZE EXIT ADDL GR5,=1 LAD GR1,TEMP 空欄f CALL ADD64 LD GR2,GR4 ; GR4に退避した値をGR2に復帰 JUMP LOOP EXIT RPOP RET