つづき(乗算器)
DEF cong(x)=MOD(x,m^N) !合同式 x'≡x (mod m^N)
SUB disp(x) !表記する PRINT USING "########": x; !10進法 PRINT " (";right$(REPEAT$(" ",N-1)&BSTR$(x,2),N);")"; !Nビット符号なし2進法 PRINT " #";BSTR$(x,16) !16進法 END SUB
LET m=2 !進法 LET N=8 !桁数 ※8ビット -128〜127
LET a=12 LET b=-3
PRINT "入力された値 ※10進法" PRINT "a=";a PRINT "b=";b PRINT
!LET N=2*N !ビット幅は2倍になる
!---------- ↓↓↓↓↓ ---------- PRINT "計算機内部の値(";m;"の補数) ※レジスタ、メモリ" LET aa=cong(a) !N桁符号あり整数へ ※符号拡張 LET bb=cong(b) PRINT "a="; CALL disp(aa) PRINT "b="; CALL disp(bb) PRINT
PRINT "乗算 ※ALU、アキュームレータ" !<--------------- ※加算との差異 PRINT USING " ########": aa PRINT USING "×########": bb !<--------------- ※ PRINT "-----------"
PRINT USING "##########": aa*bb !最上位桁の桁上りを考慮した計算<--------------- ※
LET acc=cong(aa*bb) !最上位桁の桁上りは無視する<--------------- ※
PRINT " "; CALL disp(acc) !---------- ↑↑↑↑↑ ----------
PRINT PRINT "出力装置での表示" IF acc>=m^N/2 THEN !負の数なら(MSBが1) LET dat=MOD(acc,-m^N) !N桁符号なし整数へ !!!LET dat=acc-m^N !N桁符号なし整数へ ELSE LET dat=acc !そのまま END IF PRINT dat
PRINT PRINT "検算 a*b=";a*b !<--------------- ※
END
|