+++ /dev/null
-TOKEN START
- RPUSH
- LD GR3,=-1 ; 単語の処理中を示すフラグの初期化
- ; 0: 数字だけの単語を処理中である。
- ; 1: 英字を含む単語を処理中である。
- ; -1: 単語の処理中ではない。
- LAD GR1,-1,GR1
-LP LAD GR1,1,GR1
- LD GR4,0,GR1 ; 1文字を取り出す。
- CPL GR4,='.' ; 終了判定
- JZE FIN
- CPL GR4,=' '
- JNZ ALNUM
- CALL SETTKN
- JUMP LP
-ALNUM LD GR3,GR3 ; 単語の処理中?
- JPL LP ; 英字を含む単語を処理中ならLPヘ
- JZE ACHK ; 数字だけの単語を処理中ならACHKヘ
- LD GR3,=0
- LD GR6,GR1 ; 単語の先頭アドレスを退避
-ACHK CPL GR4,='A' ; 検査対象文字は数字?
- JMI LP ; 数字の場合,次の文字の取出しヘ
- LD GR3,=1 ; 英字の場合
- JUMP LP
-;
-FIN CALL SETTKN
- LD GR5,=-1
- ST GR5,0,GR2 ; 終了マークを格納
- RPOP
- RET
-;
-SETTKN LD GR3,GR3 ; 単語の処理中?
- JMI FIN2 ; 処理中でなければ何もしない。
- ST GR6,0,GR2 ; 単語の先頭アドレスを管理テーブルに格納
- LD GR5,GR1
- SUBL GR5,GR6 ; 単語の長さを計算
- ST GR5,1,GR2 ; 単語の長さを格納
- ST GR3,2,GR2 ; 単語の属性を格納
- LD GR3,=-1 ; 単語の処理中状態を解除
- LAD GR2,3,GR2
-FIN2 RET
- END
+++ /dev/null
-MAIN START
- LAD GR1,STR
- LAD GR2,TBL
- CALL TOKEN
- RET
- DS 93
-STR DC ' THIS 1234 AN9999.'
-TBL DS 100
- END
+++ /dev/null
-;;; 平成20年 秋期 基本情報技術者 午後 問09
-;;; 最上位ビットから与えられたビット番号までのビットを1、それ以外を0に設定
-PTN1 START
- PUSH 0,GR1
- LAD GR2,15
- SUBL GR2,GR1
- LD GR1,GR2
- LD GR2,=#8000
- SRA GR2,0,GR1
- POP GR1
- RET
- END
+++ /dev/null
-;;; 平成20年 秋期 基本情報技術者 午後 問09
-;;; 最上位ビットから与えられたビット番号までのビットを0、それ以外を1に設定
-PTN2 START
- PUSH 0,GR1
- LAD GR2,16
- SUBL GR2,GR1
- LD GR1,GR2
- LD GR2,=#FFFF
- SRL GR2,0,GR1
- POP GR1
- RET
- END
+++ /dev/null
-;;; 平成20年 秋期 基本情報技術者 午後 問09
-;;; 与えられたビット番号のビットを1,それ以外を0に設定
-PTN3 START
- LD GR2,=#0001
- SLL GR2,0,GR1
- RET
- END
+++ /dev/null
-;;; 平成20年 秋期 基本情報技術者 午後 問09
-;;; 与えられたビット番号B1からB2(15>B1≧B2>0)までのビットを0、それ以外を1に設定
-PTN4 START
- ST GR1,WRK
- LD GR1,GR2
- CALL PTN1
- PUSH 0,GR2 ; PTN1 の結果を一時保存
- LD GR1,WRK
- LAD GR1,1,GR1 ; ビット番号の調整
- CALL PTN2
- POP GR1 ; 保存していた PTN1 の結果を GR1 ヘ
- XOR GR2,GR1
- LD GR1,WRK
- RET
-WRK DS 1
- END
+++ /dev/null
-../../../../../casl2 test_ptn1.casl ../ptn1.casl ../../../../../as/casl2lib/outb.casl
-1111111111100000
+++ /dev/null
-YACASL2DIR= ../../../../..
-CASL2 = $(YACASL2DIR)/casl2
-CASL2LIBDIR = $(YACASL2DIR)/as/casl2lib
-ASFILE = test_ptn1.casl ../ptn1.casl $(CASL2LIBDIR)/outb.casl
-CMD = $(CASL2) $(ASFILE)
-include $(YACASL2DIR)/test/TEST.mk
+++ /dev/null
-MAIN START
- LAD GR1,5
- CALL PTN1
- LD GR1,GR2
- CALL OUTB
- RET
- END
+++ /dev/null
-../../../../../casl2 testptn2.casl ../ptn2.casl ../../../../../as/casl2lib/outb.casl
-0000000000011111
+++ /dev/null
-YACASL2DIR= ../../../../..
-CASL2 = $(YACASL2DIR)/casl2
-CASL2LIBDIR = $(YACASL2DIR)/as/casl2lib
-ASFILE = test_ptn2.casl ../ptn2.casl $(CASL2LIBDIR)/outb.casl
-CMD = $(CASL2) $(ASFILE)
-include $(YACASL2DIR)/test/TEST.mk
+++ /dev/null
-MAIN START
- LAD GR1,5
- CALL PTN2
- LD GR1,GR2
- CALL OUTB
- RET
- END
+++ /dev/null
-../../../../../casl2 testptn3.casl ../ptn3.casl ../../../../../as/casl2lib/outb.casl
-0000000000100000
+++ /dev/null
-YACASL2DIR= ../../../../..
-CASL2 = $(YACASL2DIR)/casl2
-CASL2LIBDIR = $(YACASL2DIR)/as/casl2lib
-ASFILE = test_ptn3.casl ../ptn3.casl $(CASL2LIBDIR)/outb.casl
-CMD = $(CASL2) $(ASFILE)
-include $(YACASL2DIR)/test/TEST.mk
+++ /dev/null
-MAIN START
- LAD GR1,5
- CALL PTN3
- LD GR1,GR2
- CALL OUTB
- RET
- END
+++ /dev/null
-../../../../../casl2 test_ptn4.casl ../ptn4.casl ../ptn1.casl ../ptn2.casl ../../../../../as/casl2lib/outb.casl
-1111100000011111
+++ /dev/null
-YACASL2DIR= ../../../../..
-CASL2 = $(YACASL2DIR)/casl2
-CASL2LIBDIR = $(YACASL2DIR)/as/casl2lib
-ASFILE = test_ptn4.casl ../ptn4.casl ../ptn1.casl ../ptn2.casl $(CASL2LIBDIR)/outb.casl
-CMD = $(CASL2) $(ASFILE)
-include $(YACASL2DIR)/test/TEST.mk
+++ /dev/null
-MAIN START
- LAD GR1,10
- LAD GR2,5
- CALL PTN4
- LD GR1,GR2
- CALL OUTB
- RET
- END
+++ /dev/null
-;;; 平成20年 秋期 基本情報技術者 午後 問13
-;;; アンケートに対するn人分の回答を集計し、集計結果をグラフで出力する副プログラム
-SUMMARY START
- RPUSH
-; カウンタ領域と出力バッファを初期化
- LD GR2,=0
- LD GR3,=' '
- LD GR4,=0 ; ループカウンタ
- LAD GR5,PBUF ; 出力バッファのポインタ
-LOOP1 ST GR2,COUNTR,GR4 ; カウンタ領域を初期化
- ST GR3,0,GR5 ; 出力バッファを空白で初期化
- ST GR3,1,GR5
- ST GR3,2,GR5
- LAD GR5,3,GR5 ; 出力バッファのポインタを更新
- LAD GR4,1,GR4 ; ループカウンタを更新
- CPA GR4,=16
- JMI LOOP1
-; 項目ごとに "はい" と答えた人数を集計
- LD GR5,=0 ; GR5: "はい" の人数の最大値
-LOOP2 LD GR4,=0 ; カウンタ領域のポインタ
- LD GR2,0,GR1 ; GR2 ←1人分の回答
-LOOP3 SLL GR2,1 ; 回答は "はい" ?
- JOV ON
- JZE NEXTW ; 残りの項目はすべて "いいえ"
- JUMP OFF
-ON LD GR3,COUNTR,GR4 ; カウンタに1を加算
- ADDA GR3,=1
- ST GR3,COUNTR,GR4
- CPA GR3,GR5 ; 最大値と比較
- JPL CHANGE
- JUMP OFF
-CHANGE LD GR5,GR3 ; 最大値を入替え
-OFF LAD GR4,1,GR4 ; 次の項目
- JUMP LOOP3
-NEXTW LAD GR1,1,GR1
- SUBA GR0,=1 ; 全回答処理済?
- JPL LOOP2
-; 集計結果を棒グラフで出力
- LD GR5,GR5
- JZE FIN
- LD GR0,='*'
-LOOP4 LD GR3,=1 ; 出力バッファのポインタ
- LD GR4,=0 ; カウンタ領域のポインタ
-LOOP5 CPA GR5,COUNTR,GR4 ; "はい" の人数と比較
- JNZ NOTSET
- ST GR0,PBUF,GR3 ; 出力バッファに "*" を設定
-NOTSET LAD GR3,3,GR3 ; 出力バッファのポインタを更新
- LAD GR4,1,GR4 ; カウンタ領域のポインタを更新
- CPA GR4,=16
- JMI LOOP5
- OUT PBUF,PLEN
- SUBA GR5,=1
- JPL LOOP4
-FIN OUT FOOTER,PLEN
- RPOP
- RET
-COUNTR DS 16 ; カウンタ領域
-PLEN DC 48
-PBUF DS 48 ; 出力バッファ
-FOOTER DC '01 02 03 04 05 06 07 08 09 10 11 12 13 '
- DC '14 15 16 '
- END
+++ /dev/null
-../../../../../casl2 testsummary.casl ../summary.casl
- *
- * * * *
- * * * * * * *
- * * * * * * * * * * * * * * * *
-01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
+++ /dev/null
-YACASL2DIR= ../../../../..
-CASL2 = $(YACASL2DIR)/casl2
-CASL2LIBDIR = $(YACASL2DIR)/as/casl2lib
-ASFILE = testsummary.casl ../summary.casl
-CMD = $(CASL2) $(ASFILE)
-TESTDIR = $(YACASL2DIR)/test
-include $(TESTDIR)/TEST.mk
+++ /dev/null
-MAIN START
- LAD GR1,DATA
- LD GR0,CNT
- CALL SUMMARY
- RET
-DATA DC #9600,#F000,#A400,#FFFF,0,#2
-CNT DC 6
- END
+++ /dev/null
-;平成21年 春期 基本情報技術者 午後 問12
-MULS START ; 32ビット×16ビット→32ビット
- RPUSH
- LAD GR6,0 ; 積 上位語の初期化
- LAD GR7,0 ; 積 下位語の初期化
- LD GR4,0,GR1 ; 被乗数 上位語の取出し
- LD GR5,1,GR1 ; 被乗数 下位語の取出し
-LP SRL GR2,1 ; 乗数を1ビット右にシフト
- JOV ADD32
- JZE FIN
- JUMP NEXT ; 加算処理をスキップ
-ADD32 ADDL GR6,GR4 ; 32ビット+32ビット→32ビット
- ADDL GR7,GR5
- JOV ADJ1
- JUMP NEXT
-ADJ1 ADDL GR6,=1 ; けた上げ処理
-NEXT SLL GR4,1 ; 被乗数(32ビット)を1ビット左にシフト
- SLL GR5,1
- JOV ADJ2
- JUMP LP
-ADJ2 OR GR4,=1
- JUMP LP
-FIN ST GR6,0,GR3 ; 乗算結果の格納
- ST GR7,1,GR3
- RPOP
- RET
- END
+++ /dev/null
-;平成21年 春期 基本情報技術者 午後 問12-2
-MUL START ; 32ビット×32ビット→32ビット
- RPUSH
- PUSH 0,GR3
- PUSH 0,GR2
- LD GR2,1,GR2 ; 乗数下位語を取り出してGR2に設定
- CALL MULS ; 被乗数×乗数下位語→積(A)
- POP GR2
- LD GR2,0,GR2
- LAD GR3,SV ; 結果の格納先として作業領域を設定
- CALL MULS ; 被乗数×乗数上位語→積(B)
- LD GR6,1,GR3
- POP GR3
- ADDL GR6,0,GR3 ; 積(A)の上位語と積(B)の下位語を加算
- ST GR6,0,GR3
- RPOP
- RET
-SV DS 2
- END
-MULS START ; 32ビット×16ビット→32ビット
- RPUSH
- LAD GR6,0 ; 積 上位語の初期化
- LAD GR7,0 ; 積 下位語の初期化
- LD GR4,0,GR1 ; 被乗数 上位語の取出し
- LD GR5,1,GR1 ; 被乗数 下位語の取出し
-LP SRL GR2,1 ; 乗数を1ビット右にシフト
- JOV ADD32
- JZE FIN
- JUMP NEXT ; 加算処理をスキップ
-ADD32 ADDL GR6,GR4 ; 32ビット+32ビット→32ビット
- ADDL GR7,GR5
- JOV ADJ1
- JUMP NEXT
-ADJ1 ADDL GR6,=1 ; けた上げ処理
-NEXT SLL GR4,1 ; 被乗数(32ビット)を1ビット左にシフト
- SLL GR5,1
- JOV ADJ2
- JUMP LP
-ADJ2 OR GR4,=1
- JUMP LP
-FIN ST GR6,0,GR3 ; 乗算結果の格納
- ST GR7,1,GR3
- RPOP
- RET
- END
+++ /dev/null
-MAIN START
- LAD GR1,X
- LAD GR2,Y
- LAD GR3,A
- CALL MUL
- RET
-X DC 2,3
-Y DC 4,5
-A DS 2
- END
+++ /dev/null
-MAIN START
- LAD GR1,X
- LD GR2,Y
- LAD GR3,A
- CALL MULS
- RET
-X DC 10,30
-Y DC 4
-A DS 2
- END
+++ /dev/null
-;;; GR1に格納された値を、2進数値として表示
-OUTL START
- RPUSH
- LAD GR2,2 ; GR2に2進数の「2」を格納。
- LAD GR0,0 ; GR0 <- 0
- ST GR0,LEN ; LENの初期化
- AND GR1,GR1 ; GR1をテスト
- JZE ZINS ; GR1が0の場合、ZINSにジャンプ
-STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
- JMI STLST ; ↓
- CALL ODIVL ; GR1とGR2の、商をGR0、剰余をGR1に格納
- LD GR1,NCHAR,GR1 ; GR1を文字に変換
- CALL STSTR ; GR1をSTR領域に格納
- LD GR1,GR0 ; GR0をGR1にコピー
- JUMP STI ; ループ終端
-STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換
- CALL STSTR ; GR1をSTR領域に格納
- JUMP EMB ; EMBにジャンプ
-ZINS LD GR1,NCHAR ; 「0」をSTR領域に格納
- CALL STSTR ; ↓
-EMB LD GR1,NCHAR ; GR0 <- '0'
-EMLOOP LD GR2,LEN ; GR2 <- LEN
- CPA GR2,DIG ; ループ先頭。(GR2 = DIG)の場合は、ループ脱出
- JZE PRT ; ↓
-
- CALL STSTR ; GR1をSTR領域に格納
- JUMP EMLOOP ; ループ終端
-PRT LD GR2,LEN ; GR2にLENの値を格納
- LAD GR1,STR ; GR1に文字列のアドレスを格納
- CALL REV ; 文字列を逆順に並べ替え
- OUT STR,LEN ; 文字列を出力
- RPOP
- RET
-STR DS 17
-LEN DS 1
-NCHAR DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-DIG DC 16
- END
-;; GR1をSTR領域に格納し、LENをインクリメント
-STSTR PUSH 0,GR1
- PUSH 0,GR2
- LD GR2,LEN ; GR2にLENの値をロード
- ST GR1,STR,GR2 ; STR+GR2 <- GR1
- LAD GR2,1,GR2 ; GR2 <- GR2 + 1
- ST GR2,LEN ; LENにGR2を格納
- POP GR2
- POP GR1
- RET
- END
-;;; GR1の値とGR2の値の、商をGR0、剰余をGR1に格納する
-;;; 0〜65535の範囲の数値を扱う
-ODIVL START
- PUSH 0,GR2
- PUSH 0,GR3
- LAD GR0,0 ; GR0の初期化。商
- ST GR2,ODY ; DYにGR2の初期値を保存
- LAD GR3,1 ; GR3の初期化。対象ビットを表す
-ODSL CPL GR2,GR1 ; ループ先頭。(GR3 > GR1)の場合、DLOOPへループ脱出
- JPL ODLOOP ; ↓
- SLL GR3,1 ; GR3を1回左シフト
- SLL GR2,1 ; GR2を1回左シフト
- JOV ODYOV ; オーバーフローの場合は、ODYOVにジャンプ
- JUMP ODSL ; ループ終端
-ODYOV SRL GR2,1 ; GR2を1回右シフト
- LAD GR2,#8000,GR2 ; GR2 <- GR2 + #8000
- SRL GR3,1 ; GR3を1回右シフト
- JUMP ODLPIN ; ODLPINへジャンプ
-ODLOOP SRL GR3,1 ; ループ先頭。GR3を1回右シフト
- JZE ODFIN ; (GR3= 0)の場合、ループ脱出
- SRL GR2,1 ; GR2を1回右シフト
- CPL GR1,ODY ; (GR1 < ODY)の場合、ループ脱出
- JMI ODFIN ; ↓
- CPL GR1,GR2 ; (GR1 < GR2)の場合、ループ先頭へジャンプ
- JMI ODLOOP ; ↓
-ODLPIN SUBL GR1,GR2 ; GR1 <- GR1 - GR2
- ADDL GR0,GR3 ; GR0 <- GR0 + GR3
- JUMP ODLOOP ; ループ終端
-ODFIN POP GR3
- POP GR2
- RET
-ODY DS 1
-ODMB DC #8000
- END
-;; アドレスがGR1、長さがGR2の文字列を逆順に並べ替える
-;; 例: 12345 -> 54321、54321- -> -12345
-REV START
- RPUSH
- LAD GR3,0 ; GR3の初期化
-RPU CPL GR3,GR2 ; ループ先頭。(GR3 = GR2)の場合、ループ脱出
- JZE RNEXT ; ↓
- LD GR4,GR1 ; GR4にGR1の値をコピー
- ADDL GR4,GR3 ; GR4 <- GR4 + GR3
- LD GR5,0,GR4 ; GR5にアドレスGR4の値を格納
- PUSH 0,GR5 ; GR5をプッシュ
- LAD GR3,1,GR3 ; GR3 <- GR3 + 1
- JUMP RPU ; ループ終端
-RNEXT LAD GR3,0 ; GR3の初期化
-RPO CPL GR3,GR2 ; ループ先頭。(GR3 = GR2)の場合、ループ脱出
- JZE RFIN ; ↓
- POP GR5 ; GR5にポップ
- LD GR4,GR1 ; GR4にGR1の値をコピー
- ADDL GR4,GR3 ; GR4 <- GR4 + GR3
- ST GR5,0,GR4 ; アドレスGR4にGR5の値を格納
- LAD GR3,1,GR3 ; GR3 <- GR3 + 1
- JUMP RPO ; ループ終端
-RFIN RPOP
- RET
- END
+++ /dev/null
-REPLACE START
- RPUSH
- LD GR4,GR2 ; GR4 ← p
- SRL GR4,4 ; GR4 ← p/16
- ADDA GR1,GR4 ; GR1 を置換え対象語(第i語)に位置付ける。
- AND GR2,=#000F
- LD GR4,=16
- SUBA GR4,GR2
- LD GR5,GR0
- LD GR6,=#8000
- SUBA GR3,=1
- SRA GR6,0,GR3
- LD GR7,GR6
- SRL GR0,0,GR2
- SRL GR6,0,GR2
- SLL GR5,0,GR4
- SLL GR7,0,GR4
- LD GR2,0,GR1
- XOR GR6,GR2 ; 第i語のうち
- AND GR2,GR6 ; ビット列Bを入れる部分を0にする。
- OR GR2,GR0
- ST GR2,0,GR1
- LD GR2,1,GR1
- XOR GR7,GR2 ; 第(i+1)語のうち
- AND GR2,GR7 ; ビット列Bを入れる部分を0にする。
- OR GR2,GR5
- ST GR2,1,GR1
- RPOP
- RET
- END
+++ /dev/null
-MAIN START
- LAD GR1,A
- LD GR0,B
- LD GR2,P
- LD GR3,Q
- CALL REPLACE
- LAD GR1,A
- LAD GR2,0
-LOOP CPA GR2,CNT
- JZE FIN
- LD GR1,A,GR2
- CALL OUTB
- LAD GR2,1,GR2
- JUMP LOOP
-FIN RET
-A DC #FFFF,#FFFF,#FFFF,#FFFF,#FFFF,#FFFF
-CNT DC 6
-B DC #B1D0
-P DC 55
-Q DC 12
- END
+++ /dev/null
-FADD START ; Z ← X + Y
- RPUSH
- PUSH 0,GR3 ; 結果 Z の格納領域の先頭番地を退避
- LD GR4,0,GR1
- AND GR4,=#00FF ; Ex: X の指数
- LD GR5,0,GR2
- AND GR5,=#00FF ; Ey: Y の指数
- LD GR6,1,GR1 ; Mx: X の仮数
- LD GR7,1,GR2 ; My: Y の仮数
-; 加算前の準備 (指数をそろえる)
-; GR4 ← max(Ex,Ey) , GR6 ← 調整済 Mx , GR7 ← 調整済 My
- LD GR3,GR4
- CPL GR4,GR5
- JZE MADD ; Ex = Ey の場合
- JMI BIGEY ; Ex < Ey の場合
- SUBL GR3,GR5
- SRL GR7,0,GR3 ; My を調整
- JUMP MADD
-BIGEY LD GR4,GR5
- SUBL GR5,GR3
- SRL GR6,0,GR5 ; Mx を調整
-; 符号を考慮した仮数の加算
-; Sz: Z の符号 , Ez: Z の指数 , Mz: Z の仮数
-; GR4 ← (Sz,Ez) , GR5 ← Mz
-MADD LD GR1,0,GR1 ; X の符号の検査
- JMI XMINUS ; 負の場合
- LD GR2,0,GR2 ; Y の符号の検査
-
- LD GR5,GR6 ; X ≧ 0 , Y ≦ 0 の場合
- SUBL GR5,GR7 ; Mz ← 調整済 Mx − 調整済 My
- JUMP SCHECK
-XMINUS LD GR2,0,GR2
- JMI YMINUS
- LD GR5,GR7
- SUBL GR5,GR6
-
-YMINUS OR GR4,=#8000 ; Z に負符号を設定
-ADDMXY LD GR5,GR6
- ADDL GR5,GR7 ; Mz ← 調整済 Mx + 調整済 My
- JOV ADJST ; けた上がりがある場合の正規化
- JUMP NORM
-SCHECK JOV NEGMZ ; Mz の符号を検査
- JUMP NORM
-NEGMZ OR GR4,=#8000 ; Sz に負符号を設定
- XOR GR5,=#FFFF ; Mz ← −Mz
- ADDL GR5,=1
-;加算結果の正規化
-NORM LD GR5,GR5 ; ゼロチェック
- JNZ LOOP
- LD GR4,=0
- JUMP FIN
-LOOP LD GR5,GR5 ; 正規化完了?
- JMI FIN
-
- SUBL GR4,=1
- JUMP LOOP
-ADJST SRL GR5,1
- OR GR5,=#8000 ; Mz の最上位ビットを 1 に設定
-
-FIN POP GR3
- ST GR4,0,GR3 ; 結果 Z の格納
- ST GR5,1,GR3
- RPOP
- RET
- END
+++ /dev/null
-PREVRS START
- 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 ; 逆転した部分ビット列αを右端に移動
- SLL GR5,0,GR6 ; 逆転した部分ビット列αを左端に移動
- SRL GR5,0,GR2 ; 逆転した部分ビット列αを p ビットに移動
- LD GR6,=#8000
- SRA GR6,-1,GR3 ; q ビット連続した1の並びを作成
- SRL GR6,0,GR2
- XOR GR6,=#FFFF
- AND GR6,GR4 ; 元のビット列中の部分ビット列αにゼロを設定
- OR GR6,GR5
- ST GR6,0,GR1
- RPOP
- RET
- END
+++ /dev/null
-PREVRS START
- 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 ; 逆転した部分ビット列αを右端に移動
- SLL GR5,0,GR6 ; 逆転した部分ビット列αを左端に移動
- SRL GR5,0,GR2 ; 逆転した部分ビット列αを p ビットに移動
- LD GR6,=#8000
- SRA GR6,-1,GR3 ; q ビット連続した1の並びを作成
- SRL GR6,0,GR2
- XOR GR6,=#FFFF
- AND GR6,GR4 ; 元のビット列中の部分ビット列αにゼロを設定
- OR GR6,GR5
- ST GR6,0,GR1
- RPOP
- RET
- END
+++ /dev/null
-LREVRS START
- RPUSH
- LD GR3,GR1
- LD GR4,GR2
- SUBA GR4,=1
- JZE LOOP2
- ADDA GR4,GR1
-LOOP1 LD GR5,0,GR3 ;
- LD GR6,0,GR4 ; GR3 が指す語と GR4 が指す語の内容を
- ST GR5,0,GR4 ; 入れ替える
- ST GR6,0,GR3 ;
- LAD GR3,1,GR3 ; GR3 を次の語に位置付ける
- LAD GR4,-1,GR4 ; GR4 を一つ前の語に位置付ける
- CPA GR3,GR4
- JMI LOOP1
-LOOP2 CALL REVRS
- LAD GR1,1,GR1
- SUBA GR2,=1
- JNZ LOOP2
-FIN3 RPOP
- RET
- END
-REVRS START
- RPUSH
- LD GR4,=0 ; 結果のビット列を初期化
- LAD GR2,15 ; ループカウンタ
- LD GR3,0,GR1 ; GR3 ← ビット列
-LOOP SLL GR4,1 ; 結果のビット列を左シフト
- SRL GR3,1 ; 元のビット列を右シフト
- JOV ON
- JZE FIN1 ; 元のビット列の残りのビットはすべてゼロ
- JUMP OFF
-ON OR GR4,=#0001
-OFF SUBA GR2,=1
- JMI FIN2 ; 16 ビット処理済み
- JUMP LOOP
-FIN1 SLL GR4,0,GR2 ; 結果のビット列を残りのビット数だけシフト
-FIN2 ST GR4,0,GR1
- RPOP
- RET
- END
+++ /dev/null
-*.pbm
-*.png
+++ /dev/null
-https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2011h23_1/2011h23tokubetsu_fe_pm_qs.pdf P.57 - P.60
-次のアセンブラプログラムの説明及びプログラムを読んで,設問1~3に答えよ。
-
-〔プログラム1の説明〕
-
-連続する 16 語に格納した 16 × 16 ドットの白黒の図形を,時計回りに 90 度回転する 副プログラム ROTATE である。図形の回転の実行例を図1に示す。このとき,1ドットを1ビットで 表し,白は0,黒は1が格納されている。
-
-図1.
-five.png
-five_r.png
-
-(1) 図形を表す 16 語の先頭アドレスは GR1 に設定されて,主プログラムから渡される。
-
-(2) 回転した結果の図形を格納する領域の先頭アドレスは GR2 に設定されて, 主プログラムから渡される。
-
-(3) 元の図形と回転した図形は,異なる領域に格納される。
-
-(4) 副プログラムから戻るとき,汎用レジスタ GR1 ~ GR7 の内容は元に戻す。
-
-ROTATE START
- RPUSH
- LD GR3,=16
-LOOP1 LD GR4,=16
- LD GR5,GR2 ; GR5 ← 結果の領域のアドレス
- LD GR6,0,GR1 ; GR6 ← 元の図形の先頭語の内容
-LOOP2 LD GR7,0,GR5 ; GR7 ← 結果の領域の1語の内容
- SRL GR7,1
- SLL GR6,1
- JOV ON
- JUMP CONT
-ON OR GR7,=#8000
-CONT ST GR7,0,GR5 ; 処理した1語を結果の領域に格納
-
- SUBA GR4,=1
- JNZ LOOP2
-
- SUBA GR3,=1
- JNZ LOOP1
- RPOP
- RET
- END
-
-設問1.
-プログラム1中の に入れる正しい答えを,解答群の中から選べ。
-
-解答群
-
-ア LAD GR1,-1,GR1 イ LAD GR1,1,GR1 ウ LAD GR2,-1,GR2
-エ LAD GR2,1,GR2 オ LAD GR5,-1,GR5 カ LAD GR5,1,GR5
-
-
-設問2.
-行番号9を次のとおりに変更し,図1の回転前を元の図形として実行した。実行結果の図形として正しい答えを,解答群の中から選べ。
-
- SRL GR6,1
-
-設問3.
-プログラム1中の行番号3,4をプログラム2に置き換えて,16×16ドットの図形のうち左上のn×nドットの部分だけを時計回りに90度回転するプログラムとした。左上の8×8ドットの部分だけを回転した実行例を図2に示す。
- 値n(1≦n≦16)は GR3 に設定されて主プログラムから渡される。
- 置換え後のプログラムは,まず,回転の対象とならないドット(元の図形の上n語の右(16-n)ビットと下(16-n)語の全ビット)を結果の領域の適切な場所に複写する。その後,左上のn×nドットの部分を回転して結果の領域に格納する。
-プログラム2の に入れる正しい答えを,解答群の中から選べ。
-
-ROTATE START
- RPUSH
- LD GR3,=16
-LOOP1 LD GR4,=16
- LD GR5,GR2 ; GR5 ← 結果の領域のアドレス
- LD GR6,0,GR1 ; GR6 ← 元の図形の先頭語の内容
-LOOP2 LD GR7,0,GR5 ; GR7 ← 結果の領域の1語の内容
- SRL GR7,1
- SLL GR6,1
- JOV ON
- JUMP CONT
-ON OR GR7,=#8000
-CONT ST GR7,0,GR5 ; 処理した1語を結果の領域に格納
-
- SUBA GR4,=1
- JNZ LOOP2
-
- SUBA GR3,=1
- JNZ LOOP1
- RPOP
- RET
- END
-
-c に関する解答群
-
-ア SLL GR0,-1,GR3 イ SLL GR0,0,GR3 ウ SRL GR0,-1,GR3 エ SRL GR0,0,GR3
-
-d に関する解答群
-
-ア JMI LOOP1 イ JNZ LOOP1 ウ JPL LOOP1 エ JZE LOOP1
+++ /dev/null
-;;; 「五」を90度回転させた16 x 16のpbm画像を出力する
-;;; 呼び出し方:
-;;; casl2 call_rotate.casl rotate.casl pbm16.casl
-MAIN START
- LAD GR1,GRAPH
- LAD GR2,RES
- CALL ROTATE
- LAD GR1,RES
- CALL PBM16
- RET
-GRAPH DC #FFFC
- DC #FFFC
- DC #FFFC
- DC #0700
- DC #0700
- DC #0700
- DC #FFFC
- DC #FFFC
- DC #FFFC
- DC #071C
- DC #071C
- DC #071C
- DC #FFFF
- DC #FFFF
- DC #FFFF
- DC #0000
-RES DS 16
- END
+++ /dev/null
-;;; 「五」を90度回転させた16 x 16のpbm画像を出力する
-;;; 呼び出し方:
-;;; casl2 call_rotate2.casl rotate2.casl pbm16.casl
-MAIN START
- LAD GR1,GRAPH
- LAD GR2,RES
- LAD GR3,8
- CALL ROTATE
- LAD GR1,RES
- CALL PBM16
- RET
-GRAPH DC #FFFC
- DC #FFFC
- DC #FFFC
- DC #0700
- DC #0700
- DC #0700
- DC #FFFC
- DC #FFFC
- DC #FFFC
- DC #071C
- DC #071C
- DC #071C
- DC #FFFF
- DC #FFFF
- DC #FFFF
- DC #0000
-RES DS 16
- END
+++ /dev/null
-GRAPH START
- DC #FFFC
- DC #FFFC
- DC #FFFC
- DC #0700
- DC #0700
- DC #0700
- DC #FFFC
- DC #FFFC
- DC #FFFC
- DC #071C
- DC #071C
- DC #071C
- DC #FFFF
- DC #FFFF
- DC #FFFF
- DC #0000
- END
+++ /dev/null
-;;; 「五」を表す16 x 16のpbm画像を出力する
-;;; 呼び出し方:
-;;; casl2 out_pbm.casl pbm16.casl
-MAIN START
- LAD GR1,GRAPH
- CALL PBM16
- RET
-GRAPH DC #FFFC
- DC #FFFC
- DC #FFFC
- DC #0700
- DC #0700
- DC #0700
- DC #FFFC
- DC #FFFC
- DC #FFFC
- DC #071C
- DC #071C
- DC #071C
- DC #FFFF
- DC #FFFF
- DC #FFFF
- DC #0000
- END
+++ /dev/null
-;;; PBM16
-;;; GR1で指定されたアドレス以降のメモリを 16×16 の
-;;; 白黒ビットマップ画像データ(白:0 黒:1)とみなし、
-;;; PBM画像ファイルとして出力
-;;; 入力: GR1 画像データの先頭アドレス
-;;; 依存副プログラム: outb_w.casl divl.casl rotate.casl
-PBM16 START
- PUSH 0,GR1
- PUSH 0,GR2
- ST GR1,BEG
- OUT L1,L1LEN
- OUT L2,L2LEN
- XOR GR2,GR2
-LOOP CPL GR2,HEIGHT
- JZE FIN
- LD GR1,BEG
- ADDL GR1,GR2
- LD GR1,0,GR1
- CALL OUTB
- LAD GR2,1,GR2
- JUMP LOOP
-FIN POP GR2
- POP GR1
- RET
-L1 DC 'P1'
-L1LEN DC 2
-L2 DC '16 16'
-L2LEN DC 5
-HEIGHT DC 16
-BEG DS 1
- END
-;;; GR1に格納された値を、2進数値として表示
-OUTB START
- RPUSH
- LD GR2,BIN ; GR2に2進数の「2」を格納。
- XOR GR4,GR4 ; GR4: 2進数値の長さ
-STI CPL GR1,GR2 ; ループ先頭。(GR1 < GR2)の場合は、ループ脱出
- JMI STLST ; ↓
- CALL DIVL ; GR1とGR2の、商をGR0、剰余をGR3に格納
- LD GR1,GR3 ; GR1にGR3をコピー
- LD GR1,NCHAR,GR1 ; GR1を文字に変換
- ST GR1,STR,GR4 ; (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; GR4 <- GR4 + 1
- LD GR1,GR0 ; GR0をGR1にコピー
- JUMP STI ; ループ終端
-STLST LD GR1,NCHAR,GR1 ; GR1を文字に変換
- ST GR1,STR,GR4 ; (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; GR4 <- GR4 + 1
-EMLOOP CPL GR4,DIG ; ループ先頭。(GR4 = DIG)の場合は、ループ脱出
- JZE PRT ; ↓
- LD GR1,NCHAR ; GR1 <- NCHAR:'0'
- ST GR1,STR,GR4 ; (STR + GR4) <- GR1
- LAD GR4,1,GR4 ; GR4 <- GR4 + 1
- JUMP EMLOOP ; ループ終端
-PRT ST GR4,LEN ; LEN <- GR4
- LD GR2,LEN ; GR2にLENの値を格納
- LAD GR1,STR ; GR1に文字列のアドレスを格納
- CALL REV ; 文字列を逆順に並べ替え
- OUT STR,LEN ; 文字列を出力
- RPOP
- RET
-STR DS 17
-LEN DS 1
-BIN DC 2
-NCHAR DC '01'
-SPC DC ' '
-DIG DC 16
- END
-;;; 0〜65535の範囲にある正数の割算(筆算方式)を行う
-;;; 入力 GR1:被除数 GR2:除数
-;;; 出力 GR0:商 GR3:剰余
-;;; (GR2 = 0)の場合、GR0 GR3とも0になり、オーバーフロー
-DIVL START
- PUSH 0,GR1
- PUSH 0,GR2
- PUSH 0,GR4
- XOR GR0,GR0 ; GR0:商 初期化
- XOR GR3,GR3 ; GR3:剰余 初期化
- AND GR2,GR2 ; (GR2 = 0)の場合、DIVZEROへジャンプ
- JZE DIVZERO ; ↓
- AND GR1,GR1 ; (GR1 = 0)の場合、FINへジャンプ
- JZE FIN ; ↓
- ST GR2,Y ; YにGR2の初期値を保存
- LAD GR4,1 ; GR4:対象ビットのインデックス 初期化
-SL CPL GR2,GR1 ; ループ先頭。(GR2 > GR1)の場合、LOOPへループ脱出
- JPL LOOP ; ↓
- SLL GR4,1 ; GR4を1回左シフト
- ST GR2,TMP ; GR2の値をTMPに退避
- SLL GR2,1 ; GR2を1回左シフト
- JOV YOV ; オーバーフローの場合は、YOVへジャンプ
- JUMP SL ; ループ終端
-YOV LD GR2,TMP ; GR2の値をTMPから復元
- SRL GR4,1 ; GR4を1回右シフト
- JUMP LPIN ; LPINへジャンプ
-LOOP SRL GR4,1 ; ループ先頭。GR4を1回右シフト
- JZE SETMOD ; (GR4 = 0)の場合、SETMODへループ脱出
- SRL GR2,1 ; GR2を1回右シフト
- CPL GR1,Y ; (GR1 < Y)の場合、SETMODへループ脱出
- JMI SETMOD ; ↓
- CPL GR1,GR2 ; (GR1 < GR2)の場合、ループ先頭へジャンプ
- JMI LOOP ; ↓
-LPIN SUBL GR1,GR2 ; GR1 <- GR1 - GR2
- ADDL GR0,GR4 ; GR0 <- GR0 + GR4
- JUMP LOOP ; ループ終端
-DIVZERO LAD GR3,#8000 ; 強制的にオーバーフローを発生させ、GR3 <- 0
- SLL GR3,1 ; ↓
- JUMP FIN ; FIN へジャンプ
-SETMOD LD GR3,GR1 ; GR3 <- GR1。剰余の設定
-FIN POP GR4
- POP GR2
- POP GR1
- RET
-Y DS 1
-TMP DS 1
- END
-;;; メモリー上にある指定されたアドレス、長さの文字列を逆順に並べ替える
-;;; 例: 12345 -> 54321、54321- -> -12345
-;;; 入力 GR1:文字列のアドレス GR2:文字列の長さ
-;;; 出力 (同上)
-REV START
- RPUSH
- LAD GR3,0 ; GR3の初期化
-PU CPL GR3,GR2 ; ループ先頭。(GR3 = GR2)の場合、ループ脱出
- JZE NEXT ; ↓
- LD GR4,GR1 ; GR4 <- GR1
- ADDL GR4,GR3 ; GR4 <- GR4 + GR3
- LD GR5,0,GR4 ; GR5 <- GR4アドレスの値
- PUSH 0,GR5 ; GR5をプッシュ
- LAD GR3,1,GR3 ; GR3 <- GR3 + 1
- JUMP PU ; ループ終端
-NEXT LAD GR3,0 ; GR3の初期化
-PO CPL GR3,GR2 ; ループ先頭。(GR3 = GR2)の場合、ループ脱出
- JZE FIN ; ↓
- POP GR5 ; GR5にポップ
- LD GR4,GR1 ; GR4にGR1の値をコピー
- ADDL GR4,GR3 ; GR4 <- GR4 + GR3
- ST GR5,0,GR4 ; GR4のアドレス <- GR5の値
- LAD GR3,1,GR3 ; GR3 <- GR3 + 1
- JUMP PO ; ループ終端
-FIN RPOP
- RET
- END
+++ /dev/null
-ROTATE START
- RPUSH
- LD GR3,=16
-LOOP1 LD GR4,=16
- LD GR5,GR2 ; GR5 ← 結果の領域のアドレス
- LD GR6,0,GR1 ; GR6 ← 元の図形の先頭語の内容
-LOOP2 LD GR7,0,GR5 ; GR7 ← 結果の領域の1語の内容
- SRL GR7,1
- SLL GR6,1
- JOV ON
- JUMP CONT
-ON OR GR7,=#8000
-CONT ST GR7,0,GR5 ; 処理した1語を結果の領域に格納
- LAD GR5,1,GR5
- SUBA GR4,=1
- JNZ LOOP2
- LAD GR1,1,GR1
- SUBA GR3,=1
- JNZ LOOP1
- RPOP
- RET
- END
+++ /dev/null
-ROTATE START
- RPUSH
- ST GR3,N
- LD GR4,GR3
- LD GR5,GR1
- LD GR6,GR2
- LD GR7,=16
- SUBA GR7,GR3
-SHIFT LD GR0,0,GR5
- SLL GR0,0,GR3
- ST GR0,0,GR6 ; 結果の領域 ← GR0
- LAD GR5,1,GR5 ; 元の図形の1語のアドレス更新
- LAD GR6,1,GR6 ; 結果の図形の1語のアドレス更新
- SUBA GR4,=1 ; n語処理済み?
- JNZ SHIFT
-COPY SUBA GR7,=1 ; 残りの語の内容を結果の領域に複写
- JMI LOOP1
- LD GR0,0,GR5
- ST GR0,0,GR6
- LAD GR5,0,GR5
- LAD GR6,0,GR6
- JUMP COPY
-N DS 1
-LOOP1 LD GR4,N
- LD GR5,GR2 ; GR5 ← 結果の領域のアドレス
- LD GR6,0,GR1 ; GR6 ← 元の図形の先頭語の内容
-LOOP2 LD GR7,0,GR5 ; GR7 ← 結果の領域の1語の内容
- SRL GR7,1
- SLL GR6,1
- JOV ON
- JUMP CONT
-ON OR GR7,=#8000
-CONT ST GR7,0,GR5 ; 処理した1語を結果の領域に格納
- LAD GR5,1,GR5
- SUBA GR4,=1
- JNZ LOOP2
- LAD GR1,1,GR1
- SUBA GR3,=1
- JNZ LOOP1
- RPOP
- RET
- END
+++ /dev/null
-https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2011h23_2/2011h23a_fe_pm_qs.pdf P.56 - P.59
-次のアセンブラプログラムの説明及びプログラムを読んで,設問1,2に答えよ。
-
-〔プログラム1の説明〕
-
-除算を行う副プログラム DIV である。
-
-(1) DIV は表1に示すレジスタを介して,被除数と除数を受け取り,商と剰余を返す。 数値は全て 32 ビットの符号なし整数とし,除数は0でないものとする。
-
-表1 パラメタの受渡し方法
- 上位語(上位 16 ビット) 下位語(下位 16 ビット)
-入力 被除数 GR1 GR2
- 除数 連続する2語に,上位 16 ビット,下位 16 ビットの順に格納し,上位語のアドレスを GR3 に設定
-出力 商 GR1 GR2
- 剰余 GR4 GR5
-
-(2) 副プログラム DIV から戻るとき,汎用レジスタ GR6, GR7 の内容は元に戻す。
-
-設問1.
-プログラム1中の に入れる正しい答えを,解答群の中から選べ。
-
-a に関する解答群
-
-ア ADDL GR1,0,GR3 イ ADDL GR1,=1 ウ ADDL GR2,1,GR3
-エ ADDL GR2,=1 オ ADDL GR4,0,GR3 カ ADDL GR5,1,GR3
-
-b に関する解答群
-
-ア JMI ADJ2 イ JMI CONT ウ JOV ADJ2
-エ JOV CONT オ JPL ADJ2 カ JPL CONT
-
-設問2.
-10進表記で 0~99999 の値の整数を32ビット符号なし整数として与えたとき,DIV を用いて10進数文字列に変換する副プログラム BTOD を異なるアルゴリズムで2種類作成した。プログラム2は10進表記の上位桁から求めるものであり,プログラム3は10進表記の下位桁から求めるものである。プログラム2,プログラム3中の に入れる正しい答えを,解答群の中から選べ。
-BTOD は32ビット符号なし整数の上位語を GR1 に,下位語を GR2 に,変換結果を格納する領域の先頭アドレスを GR3 に設定して呼び出される。
-変換後の10進数文字列は5語の領域に格納される。ただし,5桁に満たない場合は上位桁に"0"が補われる。対象数値が16進表記で 0000054D の場合の実行結果を,次に示す。
-pm12_3.gif/image-size:317×50
-副プログラム BTOD から戻るとき,汎用レジスタ GR1~GR7 の内容は元に戻す。
+++ /dev/null
-BTOD START
- RPUSH
- LD GR6,GR3
- LAD GR7,4,GR3
- LAD GR3,UDAT ; 除数の初期設定
-LP CALL DIV
- OR GR2,='0'
- ST GR2,0,GR6 ; 10進数字1文字格納
- CPL GR6,GR7
- JZE FIN
- LAD GR6,1,GR6
- LD GR1,GR4 ; 被除数の再設定
- LD GR2,GR5
- LAD GR3,2,GR3
- JUMP LP
-FIN RPOP
- RET
-UDAT DC 0
- DC 10000
- DC 0
- DC 1000
- DC 0
- DC 100
- DC 0
- DC 10
- DC 0
- DC 1
- END
+++ /dev/null
-BTOD START
- RPUSH
- LAD GR6,4,GR3
- LD GR7,GR3
- LAD GR3,DAT
-LP CALL DIV
- OR GR5,='0'
- ST GR5,0,GR6
- CPL GR6,GR7
- JZE FIN
- LAD GR6,-1,GR6
- JUMP LP
-FIN RPOP
- RET
-DAT DC 0
- DC 10
- END
+++ /dev/null
-MAIN START
- LAD GR1,#0000
- LAD GR2,#054D
- LAD GR3,STR
- CALL BTOD
- OUT STR,LEN
- RET
-STR DS 5
-LEN DC 5
- END
+++ /dev/null
-MAIN START
- LAD GR1,0
- LAD GR2,17
- LAD GR3,OP
- CALL DIV
- RET
-OP DC 0,3
- END
+++ /dev/null
-DIV START ; 減算を用いた32ビット除算
- PUSH 0,GR6
- PUSH 0,GR7
- LD GR6,GR1
- LD GR7,GR2
- LD GR1,=#FFFF ; 商の初期化
- LD GR2,=#FFFF
-LP LD GR4,GR6
- LD GR5,GR7
- ADDL GR2,=1 ; 商のカウントアップ
- JOV ADJ1
- JUMP CONT
-ADJ1 ADDL GR1,=1
-CONT SUBL GR6,0,GR3
- JOV FIN
- SUBL GR7,1,GR3
- JOV ADJ2
- JUMP LP
-ADJ2 SUBL GR6,=1
- JOV FIN
- JUMP LP
-FIN POP GR7
- POP GR6
- RET
- END
-
+++ /dev/null
-MAIN START
- LAD GR1,WD
- CALL MULT
- LD GR1,GR0
- LAD GR2,STR
- CALL L2STR
- ST GR0,LEN
- OUT STR,LEN
- RET
-WD DC '12 45.'
-STR DS 5
-LEN DS 1
+++ /dev/null
-DTOB START
- RPUSH
- ADDL GR2,GR1
- LAD GR0,0 ; 戻り値の初期化
-LP CPL GR1,GR2 ; 変換終了?
- JZE FIN
- LD GR4,0,GR1 ; 数字1文字の取出し
- SUBL GR4,='0' ; 1 桁を数値に変換
- SLL GR0,1 ; GR0を10倍してGR4を加算
- LD GR5,GR0
- SLL GR5,2
- ADDL GR0,GR5
- ADDL GR0,GR4
- LAD GR1,1,GR1
- JUMP LP
-FIN RPOP
- RET
- END
+++ /dev/null
-GETWD START
- RPUSH
- LD GR6,GR1
- LD GR7,GR2
- LD GR3,=-1 ; 数字列の処理状態フラグの初期化
- LAD GR6,-1,GR6
-LP LAD GR6,1,GR6
- LD GR4,0,GR6 ; 1文字の取出し
- CPL GR4,='.'
- JZE FIN
- CPL GR4,=' '
- JNZ NUM
- CALL SETWD
- JUMP LP
-NUM LD GR3,GR3 ; 数字列の処理中?
- JZE LP
- LD GR3,=0 ; 次の数字列の処理開始
- LD GR1,GR6 ; 数字列の先頭アドレスを退避
- JUMP LP
-FIN CALL SETWD
- LD GR2,=-1
- ST GR2,0,GR7 ; 数値の終わりを示す印を格納
- RPOP
- RET
-SETWD LD GR3,GR3
- JNZ FIN2
- LD GR2,GR6
- SUBL GR2,GR1
- CALL DTOB ; 数字列を数値に変換
- ST GR0,0,GR7
- LD GR3,=-1 ; 数字列の処理中状態を解除
- LAD GR7,1,GR7
-FIN2 RET
- END
+++ /dev/null
-../../casl2lib/l2str.casl
\ No newline at end of file
+++ /dev/null
-MULT START
- RPUSH
- LAD GR2,CTBL
- CALL GETWD
- LD GR4,0,GR2 ; GR4 ← 被乗数
- LD GR5,1,GR2 ; GR5 ← 乗数
- LD GR0,=0
- LD GR5,GR5
-LP JZE FIN
- LD GR3,GR5
- AND GR3,=#0001 ; 乗数の最下位ビットのチェック
- JZE NEXT
- ADDL GR0,GR4
-NEXT SLL GR4,1 ; 被乗数を1ビット左論理シフト
- SRL GR5,1
- JUMP LP
-FIN RPOP
- RET
-CTBL DS 3 ; GETWD用管理テーブル
- END
+++ /dev/null
-*.html
-*.pdf
-*.eps
+++ /dev/null
-VPATH := img
-
-CSS := ../style.css
-
-TEXITARGETS := fe_2018_04.html fe_2018_04.pdf
-
-.PHONY: all clean distclean
-
-all: $(TEXITARGETS)
-
-clean: texinfo-clean
- $(RM) *.bak
- $(MAKE) -C img clean
-
-distclean: clean texinfo-distclean
- $(RM) *.d *.html *.pdf
- $(MAKE) -C img distclean
-
-include ../texinfo_exam.mk
-
-include ../../images.mk
+++ /dev/null
-\input texinfo @c -*-texinfo-*-
-@c %**start of header
-@ifnottex
-@documentlanguage ja_JP
-@end ifnottex
-@setfilename exam_fe_2018h.info
-@documentencoding UTF-8
-@settitle 基本技術情報者試験 2018年 春期 午後問題
-@firstparagraphindent insert
-@paragraphindent 0
-@ifhtml
-@exampleindent 0
-@end ifhtml
-@c %**end of header
-
-@indicateurl{https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2018h30_1/2018h30h_fe_pm_qs.pdf} P.62〜P.66より
-
-@unnumbered 問12
-次のアセンブラプログラムの説明及びプログラムを読んで,設問1~3に答えよ。
-
-@unnumberedsec 〔プログラム1の説明〕
-0~65534の整数を表す数字から成る文字列(以下,数字列という)を数値に変換する副プログラムDTOBである。
-
-(1) 文字列は,DC命令の文字定数と同じ形式で主記憶に格納される。数字列567を 格納した例を,図1に示す。
-
-@center @image{img/fig1,15cm,,,.svg}
-
-@center 図1 数字列の格納例
-
-(2) 主プログラムは,数字列が格納されている領域の先頭アドレスをGR1に,数字列の長さをGR2に設定して,DTOBを呼ぶ。DTOBは,数値に変換して得た値をGR0に格納して呼出し元に戻る。
-
-(3) 副プログラムDTOBから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。
-
-
-@unnumberedsubsec〔プログラム1〕
-
-@verbatim
-DTOB START
- RPUSH
- ADDL GR2,GR1
- LAD GR0,0 ; 戻り値の初期化
-LP CPL GR1,GR2 ; 変換終了?
- JZE FIN
- LD GR4,0,GR1 ; 数字1文字の取出し
- SUBL GR4,='0' ; 1 桁を数値に変換
- SLL GR0,1 ; GR0を10倍してGR4を加算
- LD GR5,GR0
- ::ansbox:8:a::
- ADDL GR0,GR5
- ADDL GR0,GR4
- LAD GR1,1,GR1
- JUMP LP
-FIN RPOP
- RET
- END
-@end verbatim
-
-@unnumberedsec 設問1
-
-プログラム1中の::ansbox:4::に入れる正しい答えを,解答群の中から選べ。
-
-aに関する解答群
-@itemize @w{}
-
-@item
-ア @code{ADDL GR5,GR4}
-
-@item
-イ @code{SLL GR4,1}
-
-@item
-ウ @code{SLL GR4,2}
-
-@item
-エ @code{SLL GR5,1}
-
-@item
-オ @code{SLL GR5,2}
-@end itemize
-
-@unnumberedsec 設問2
-
-文字列の先頭から数字列を探索し,順に,対応する数値を管理テーブルに格納する副プログラムGETWDを,DTOBを使用して作成した。プログラム2中の::ansbox:4::に入れる正しい答えを,解答群の中から選べ。
-
-
-@unnumberedsubsec 〔プログラム2の説明〕
-
-(1) 文字列は,一つ以上の空白文字で区切られた任意の個数の数字列を含み,最後はピリオドで終わる。最後の数字列とピリオドの間,又は文字列の先頭に一つ以上の空白文字があってもよい。文字列の例を,図2に示す。
-
-
-@center @image{img/fig2,15cm,,,.svg}
-
-@center 図2 文字列の例
-
-(2) 管理テーブルには,文字列中に数字列が現れるごとに,順に1 語から成る要素を追加し,数字列を数値に変換して得た値を格納する。数字列の探索が終了したとき,管理テーブルの最後に1 語から成る要素を追加し,数値の終わりを示す印として-1を格納する。図2の文字列をGETWDで処理して得た管理テーブルを,図3に示す。
-
-@center @image{img/fig3,15cm,,,.svg}
-
-@center 図3 GETWDで処理して得た管理テーブル
-
-(3) 主プログラムは,文字列が格納されている領域の先頭アドレスをGR1に,管理テーブルの先頭アドレスをGR2に設定して,GETWDを呼ぶ。
-
-(4) 副プログラムGETWDから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。
-
-@unnumberedsubsec 〔プログラム2〕
-
-@verbatim
-GETWD START
- RPUSH
- LD GR6,GR1
- LD GR7,GR2
- LD GR3,=-1 ; 数字列の処理状態フラグの初期化
- LAD GR6,-1,GR6
-LP LAD GR6,1,GR6
- LD GR4,0,GR6 ; 1文字の取出し
- CPL GR4,='.'
- JZE FIN
- CPL GR4,=' '
- ::ansbox:8:b::
- CALL SETWD
- JUMP LP
-NUM LD GR3,GR3 ; 数字列の処理中?
- JZE LP
- LD GR3,=0 ; 次の数字列の処理開始
- LD GR1,GR6 ; 数字列の先頭アドレスを退避
- JUMP LP
-FIN CALL SETWD
- LD GR2,=-1
- ST GR2,0,GR7 ; 数値の終わりを示す印を格納
- RPOP
- RET
-SETWD LD GR3,GR3
- ::ansbox:8:c::
- LD GR2,GR6
- SUBL GR2,GR1
- CALL DTOB ; 数字列を数値に変換
- ST GR0,0,GR7
- LD GR3,=-1 ; 数字列の処理中状態を解除
- ::ansbox:8:d::
-FIN2 RET
- END
-@end verbatim
-
-
-bに関する解答群
-@itemize @w{}
-
-@item
-ア @code{JNZ FIN}
-
-@item
-イ @code{JNZ LP}
-
-@item
-ウ @code{JNZ NUM}
-
-@item
-エ @code{JZE FIN}
-
-@item
-オ @code{JZE LP}
-
-@item
-カ @code{JZE NUM}
-@end itemize
-
-cに関する解答群
-@itemize @w{}
-
-@item
-ア @code{JNZ FIN}
-
-@item
-イ @code{JNZ FIN2}
-
-@item
-ウ @code{JNZ NUM}
-
-@item
-エ @code{JZE FIN}
-
-@item
-オ @code{JZE FIN2}
-
-@item
-カ @code{JZE NUM}
-@end itemize
-
-d に関する解答群
-
-@itemize @w{}
-@item
-ア @code{LAD GR6,1,GR1}
-
-@item
-イ @code{LAD GR6,1,GR6}
-
-@item
-ウ @code{LAD GR7,1,GR2}
-
-@item
-エ @code{LAD GR7,1,GR7}
-
-@item
-オ @code{LD GR6,GR1}
-
-@item
-カ @code{LD GR7,GR2}
-@end itemize
-
-@unnumberedsec 設問3
-
-GETWDを使用して,二つの整数の積を求める副プログラムMULTを作成した。プログラム3中の::ansbox:4::に入れる正しい答えを,解答群の中から選べ。
-
-@unnumberedsubsec 〔プログラム3の説明〕
-
-(1) MULTは,数字列を二つだけ含む,〔プログラム2の説明〕の(1)で示した形式の文字列について,最初の数字列に対応する数値を被乗数とし,2番目の数字列に対応する数値を乗数として乗算を行う。乗算においてあふれは発生しないものとする。
-
-(2) 主プログラムは,文字列が格納されている領域の先頭アドレスをGR1に設定して,MULTを呼ぶ。MULTは,演算結果をGR0に格納して呼出し元に戻る。
-
-(3) 副プログラムMULTから戻るとき,汎用レジスタGR1~GR7の内容は元に戻す。
-
-@unnumberedsubsec 〔プログラム3〕
-
-@verbatim
-MULT START
- RPUSH
- LAD GR2,CTBL
- CALL GETWD
- LD GR4,0,GR2 ; GR4 ← 被乗数
- LD GR5,1,GR2 ; GR5 ← 乗数
- LD GR0,=0
- LD GR5,GR5
-LP ::ansbox:8:e::
- LD GR3,GR5
- AND GR3,=#0001 ; 乗数の最下位ビットのチェック
- JZE NEXT
- ADDL GR0,GR4
-NEXT SLL GR4,1 ; 被乗数を1ビット左論理シフト
- ::ansbox:8:f::
- JUMP LP
-FIN RPOP
- RET
-CTBL DS 3 ; GETWD用管理テーブル
- END
-@end verbatim
-
-eに関する解答群
-
-@itemize @w{}
-@item
-ア @code{JMI FIN}
-
-@item
-イ @code{JMI NEXT}
-
-@item
-ウ @code{JPL FIN}
-
-@item
-エ @code{JPL NEXT}
-
-@item
-オ @code{JZE FIN}
-
-@item
-カ @code{JZE NEXT}
-@end itemize
-
-
-fに関する解答群
-
-@itemize @w{}
-@item
-ア @code{ADDL GR0,GR5}
-
-@item
-イ @code{ADDL GR5,GR4}
-
-@item
-ウ @code{LD GR5,GR4}
-
-@item
-エ @code{SLL GR5,1}
-
-@item
-オ @code{SRL GR5,1}
-@end itemize
-@bye
+++ /dev/null
-all: $(foreach ext,.png .eps,$(addsuffix $(ext),$(basename $(wildcard *.svg))))
-
-clean:
- $(RM) *.log
-
-distclean: clean
- $(RM) *.png *.eps *.jpg
-
-include ../../../images.mk
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="90" viewBox="0 0 200 60">
- <g transform="translate(10,10)">
- <g stroke="black" stroke-width="1" fill="none">
- <rect x="0" y="0" width="180" height="30" />
- <line x1="60" y1="0" x2="60" y2="30" />
- <line x1="120" y1="0" x2="120" y2="30" />
- </g>
- <g font-family="monospace" font-size="10" fill="black">
- <text x="15" y="20">#0035</text>
- <text x="75" y="20">#0036</text>
- <text x="135" y="20">#0037</text>
- </g>
- <g font-family="sans-serif" font-size="10px" fill="black">
- <text x="5" y="40">(1語目)</text>
- <text x="65" y="40">(2語目)</text>
- <text x="125" y="40">(3語目)</text>
- </g>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="360" height="120" viewBox="0 0 240 60">
- <g transform="translate(10,10)">
- <rect x="0" y="0" width="170" height="30" stroke="black" stroke-width="1" fill="none" />
- <text font-family="monospace" font-size="10" fill="black" x="10" y="20">△△1234△56789△△△9876△.</text>
- <g font-family="sans-serif" font-size="10" fill="black">
- <text x="0" y="40">注記</text>
- <text x="30" y="40">空白文字は“△”と表示する</text>
- </g>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="360" height="90" viewBox="0 0 240 60">
- <g transform="translate(10,10)">
- <g stroke="black" stroke-width="1" fill="none">
- <rect x="0" y="0" width="200" height="30" />
- <line x1="50" y1="0" x2="50" y2="30" />
- <line x1="100" y1="0" x2="100" y2="30" />
- <line x1="150" y1="0" x2="150" y2="30" />
- </g>
- <g font-family="monospace" font-size="10px" fill="black">
- <text x="20" y="20">1234</text>
- <text x="65" y="20">56789</text>
- <text x="120" y="20">9876</text>
- <text x="180" y="20">-1</text>
- </g>
- <g font-family="sans-serif" font-size="10" fill="black">
- <text x="0" y="40">注記</text>
- <text x="30" y="40">数値は,10進数で表記している。</text>
- </g>
- </g>
-</svg>
+++ /dev/null
-body {
- margin-left: 6em;
- margin-right: 12em;
- color: black;
- background-color: #EEE;
- font-family: sans-serif;
-}
-
-h1, h2, h3, h4, h5, h6 {
- color: navy;
- background-color: inherit;
-}
-
-h1, h2 {
- margin-left: -2em;
-}
-
-.node{
- margin-left: -3em;
- color: inherit;
- background-color: #DDF;
-}
-
-.menu, .node {
- color: inherit;
- background-color: #DDF;
-}
-
-table.menu, table.menu th, table.menu td {
- border-style: none;
-}
-
-h2 {
- padding: 0.25em;
-}
-
-.contents {
- background-color: #DDF;
- border: 4px double #000;
- padding: 0.5em 1em 0.5em 1em;
-}
-
-.contents h2 {
- margin-left: 0;
- color: black;
- background-color: #DDF;
-}
-
-.contents li {
- list-style-type: none;
-}
-
-.shortcontents {
- background-color: #DDF;
- border: 4px double #000;
- }
-
-.shortcontents h2{
- display: none;
-}
-
-h1.node-heading {
- display: none;
-}
-
-h2.contents-heading{
- display: none;
-}
-
-h2.shortcontents-heading{
- display: none;
-}
-
-.shortcontents a {
- margin-right: 1em;
-}
-
-h3, h4, h5 {
- margin-left: -1em;
-}
-
-h5 {
- font-size: 100%;
-}
-
-p {
- line-height: 1.25em;
- margin-top: 0;
- margin-bottom: 0.5em;
-}
-
-a:hover {
- color: red;
- text-decoration: underline;
-}
-
-pre.example, pre.verbatim {
- padding: 0.5em 1em 0.5em 1em;
- border: 1px solid #CCC;
- font-size: 120%;
-}
-
-a {
- text-decoration: none;
-}
-
-blockquote {
- line-height: 1.25em;
- border: 1px solid #00F;
-}
-
-kbd, code, .file, var {
- font-style: normal;
- font-weight: normal;
- font-family: monospace;
- font-size: 120%;
- margin-left:0.25em;
- margin-right: 0.25em;
-}
-
-table, th, td {
- border: 1px solid black;
- border-collapse: collapse; /* 枠線の表示方法 */
- margin-bottom: 1em;
-}
-
-table.cartouche, table.cartouche th, table.cartouche td {
- border: none;
-}
-
-pre.example .command, pre.example .option, pre.example kbd {
- font-weight: bold;
- font-family: monospace;
- font-size: 110%;
- background-color: inherit;
- font-style: normal;
- margin-left:0;
- margin-right: 0;
-}
-
-pre.example strong {
- font: inherit;
- border: 2px solid green;
-}
-
-th, em {
- font-style: normal;
- font-weight: bold;
- font-family: sans-serif;
-}
-
-th {
- text-align: center;
-}
-
-dfn {
- font-style: normal;
-}
-
-.header, .menu {
- display: none;
-}
-
-.selection {
- color: navy;
- font-weight: bold;
- margin-right: 1em;
-}
-
-.ansbox {
- border: 2px solid navy;
- text-align: center;
- display: inline-block;
-}
+++ /dev/null
-.PHONY: texinfo-distclean texinfo-clean texinfo-textmp-clean
-
-CP := cp
-DVIPDFMX := dvipdfmx
-DVIPDFMX_FLAGS ?=
-ECHO := echo
-INSTALL-INFO := install-info
-MAKEINFO_FLAGS ?=
-MKDIR := mkdir
-RMR := rm -rf
-SED := sed
-TEX := ptex
-TEXI2DVI := TEX=$(TEX) texi2dvi
-TEXI2DVI_FLAGS ?= -q --texinfo=@afourpaper
-MV := mv
-
-# \includeコマンドで読み込まれるファイル
-intexi = $(strip $(shell $(SED) -n -e 's/@include \(.*\)/\1/pg' $<))
-
-# \imageコマンドで読み込まれるファイル
-imagetexi = $(strip $(shell $(SED) -n -e 's/.*@image{\([^,]*\)\(,[^,]*,[^,]*,[^,]*,\([^,}]*\)\)}.*/\1\3/p' $<))
-
-# 依存関係を自動生成し、dファイルに格納
-%.d: %.texi
- @$(ECHO) '$@ is created by scanning $<.'
- # texiファイルと出力ファイルの依存関係
- @$(ECHO) '$(foreach ext,.html _html .pdf .xml .info .txt .d,$(subst .texi,$(ext),$<)): $<' >$@
- # includeファイルの依存関係
- $(if $(intexi),@( \
- $(ECHO) >>$@; \
- $(ECHO) '# Include Files' >>$@; \
- $(ECHO) '$(foreach ext,.html _html .info .pdf .xml .txt,$<),$(subst .texi,$(ext),$<): $(intexi)') >>$@)
- # imageファイルの依存関係
- # Docbookは未定義
- $(if $(imagetexi),@( \
- $(ECHO) >>$@; \
- $(ECHO) '# Image Files: HTML, HTML split, Info' >>$@; \
- $(ECHO) '$(foreach ext,.html _html .info,$(subst .texi,$(ext),$<)): $(imagetexi)' >>$@))
- $(if $(imagetexi),@( \
- $(ECHO) >>$@; \
- $(ECHO) '# Imagefiles: DVI -> PDF' >>$@; \
- $(ECHO) '$(subst .texi,.pdf,$<): $(addsuffix .eps,$(basename $(imagetexi)))' >>$@))
-
-# 変数TEXITARGETSで指定されたターゲットファイルに対応するdファイルをインクルード
-# .dファイルからヘッダファイルの依存関係を取得する
-# ターゲットに clean が含まれている場合は除く
-ifeq (,$(filter %clean,$(MAKECMDGOALS)))
- -include $(addsuffix .d,$(basename $(TEXITARGETS)))
-endif
-
-%.info: %.texi
- $(MAKEINFO) $(MAKEINFO_FLAGS) -o $@ $<
-
-%.html: %.texi
- $(MAKEINFO) -o $@ --no-split --html --css-include=$(CSS) $<
- $(SED) -i '' -e 's%<img src="\([^"]*\)" *[^>]*>%<object type="image/svg+xml" data="\1">&</object>%g' $@
- $(SED) -i '' -e 's%<!-- /@w --> \([アイウエオカキクケコ]\)%<span class="selection">\1</span>%g' $@
- $(SED) -i '' -e 's%::ansbox:\([0-9]*\):*\([a-zA-Z]\)*::%<span class="ansbox" style="min-width:\1em">\2\ </span>%g' $@
-
-%.html %_html: $(CSS)
-
-%.pdf: %.dvi
- $(DVIPDFMX) $(DVIPDFMXFLAGS) $<
-
-%.txt: %.texi
- $(MAKEINFO) --no-headers --disable-encoding -o $@ $<
-
-%.xml: %.texi
- @$(MAKEINFO) --docbook -o $@ $<
-
-texinfo-distclean: texinfo-clean
- $(RMR) *_html *.info *.html *.pdf *.dvi *.txt
-
-texinfo-clean: texinfo-textmp-clean
- $(RM) *.d
-
-texinfo-textmp-clean:
- $(RM) *.aux *.cp *.cps *.fn *.ky *.log *.pg *.pgs *.tmp *.toc *.tp *.vr