情報処理試験2011(平成23)年のフォルダーを更新
authorj8takagi <j8takagi@nifty.com>
Wed, 6 Jun 2018 10:28:28 +0000 (19:28 +0900)
committerj8takagi <j8takagi@nifty.com>
Wed, 6 Jun 2018 10:28:28 +0000 (19:28 +0900)
.gitignore
as/fe_tests/2011_06/Q12/.gitignore [new file with mode: 0644]
as/fe_tests/2011_06/Q12/Q12.txt
as/fe_tests/2011_06/Q12/call_rotate.casl
as/fe_tests/2011_06/Q12/call_rotate2.casl [new file with mode: 0644]
as/fe_tests/2011_06/Q12/graph_five.casl [new file with mode: 0644]
as/fe_tests/2011_06/Q12/out_pbm.casl [new file with mode: 0644]
as/fe_tests/2011_06/Q12/pbm16.casl [new file with mode: 0644]
as/fe_tests/2011_06/Q12/rotate.casl
as/fe_tests/2011_06/Q12/rotate2.casl [new file with mode: 0644]

index e2eadfc..7359497 100644 (file)
@@ -3,6 +3,7 @@
 /dumpword
 /disassemble
 *.o
+*.o.casl
 !as/sample/hello.o
 !as/sample/sum_10.o
 *~
diff --git a/as/fe_tests/2011_06/Q12/.gitignore b/as/fe_tests/2011_06/Q12/.gitignore
new file mode 100644 (file)
index 0000000..237bae2
--- /dev/null
@@ -0,0 +1,2 @@
+*.pbm
+*.png
index ed4e5b3..24152ab 100644 (file)
@@ -1,9 +1,14 @@
+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 に設定されて, 主プログラムから渡される。
 
 (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
index 375e5db..40b6ef4 100644 (file)
@@ -1,5 +1,28 @@
-        MAIN    START
-        RPUSH
-        LD      GR1,ORG
+;;; 「五」を90度回転させた16 x 16のpbm画像を出力する
+;;; 呼び出し方:
+;;;   casl2 call_rotate.casl rotate.casl pbm16.casl
+MAIN    START
+        LAD     GR1,GRAPH
         LAD     GR2,RES
-ORG     DC      #FC,#FC,#FC,#70,#70,#70,#FC,#FC,#FC,
+        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
diff --git a/as/fe_tests/2011_06/Q12/call_rotate2.casl b/as/fe_tests/2011_06/Q12/call_rotate2.casl
new file mode 100644 (file)
index 0000000..d4ed34f
--- /dev/null
@@ -0,0 +1,29 @@
+;;; 「五」を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
diff --git a/as/fe_tests/2011_06/Q12/graph_five.casl b/as/fe_tests/2011_06/Q12/graph_five.casl
new file mode 100644 (file)
index 0000000..7b53ace
--- /dev/null
@@ -0,0 +1,18 @@
+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
diff --git a/as/fe_tests/2011_06/Q12/out_pbm.casl b/as/fe_tests/2011_06/Q12/out_pbm.casl
new file mode 100644 (file)
index 0000000..4eebee2
--- /dev/null
@@ -0,0 +1,24 @@
+;;; 「五」を表す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
diff --git a/as/fe_tests/2011_06/Q12/pbm16.casl b/as/fe_tests/2011_06/Q12/pbm16.casl
new file mode 100644 (file)
index 0000000..e615f35
--- /dev/null
@@ -0,0 +1,142 @@
+;;; 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
index 6d33995..1ec2d29 100644 (file)
@@ -1,4 +1,4 @@
-        ROTATE  START
+ROTATE  START
         RPUSH
         LD     GR3,=16
 LOOP1   LD     GR4,=16
diff --git a/as/fe_tests/2011_06/Q12/rotate2.casl b/as/fe_tests/2011_06/Q12/rotate2.casl
new file mode 100644 (file)
index 0000000..d2d7061
--- /dev/null
@@ -0,0 +1,42 @@
+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