From fe3360c6043b31888d5a0ce928096ed0c57905f6 Mon Sep 17 00:00:00 2001 From: j8takagi Date: Wed, 6 Jun 2018 19:28:28 +0900 Subject: [PATCH] =?utf8?q?=E6=83=85=E5=A0=B1=E5=87=A6=E7=90=86=E8=A9=A6?= =?utf8?q?=E9=A8=932011=EF=BC=88=E5=B9=B3=E6=88=9023=EF=BC=89=E5=B9=B4?= =?utf8?q?=E3=81=AE=E3=83=95=E3=82=A9=E3=83=AB=E3=83=80=E3=83=BC=E3=82=92?= =?utf8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + as/fe_tests/2011_06/Q12/.gitignore | 2 + as/fe_tests/2011_06/Q12/Q12.txt | 78 ++++++++++++ as/fe_tests/2011_06/Q12/call_rotate.casl | 31 ++++- as/fe_tests/2011_06/Q12/call_rotate2.casl | 29 +++++ as/fe_tests/2011_06/Q12/graph_five.casl | 18 +++ as/fe_tests/2011_06/Q12/out_pbm.casl | 24 ++++ as/fe_tests/2011_06/Q12/pbm16.casl | 142 ++++++++++++++++++++++ as/fe_tests/2011_06/Q12/rotate.casl | 2 +- as/fe_tests/2011_06/Q12/rotate2.casl | 42 +++++++ 10 files changed, 364 insertions(+), 5 deletions(-) create mode 100644 as/fe_tests/2011_06/Q12/.gitignore create mode 100644 as/fe_tests/2011_06/Q12/call_rotate2.casl create mode 100644 as/fe_tests/2011_06/Q12/graph_five.casl create mode 100644 as/fe_tests/2011_06/Q12/out_pbm.casl create mode 100644 as/fe_tests/2011_06/Q12/pbm16.casl create mode 100644 as/fe_tests/2011_06/Q12/rotate2.casl diff --git a/.gitignore b/.gitignore index e2eadfc..7359497 100644 --- a/.gitignore +++ b/.gitignore @@ -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 index 0000000..237bae2 --- /dev/null +++ b/as/fe_tests/2011_06/Q12/.gitignore @@ -0,0 +1,2 @@ +*.pbm +*.png diff --git a/as/fe_tests/2011_06/Q12/Q12.txt b/as/fe_tests/2011_06/Q12/Q12.txt index ed4e5b3..24152ab 100644 --- a/as/fe_tests/2011_06/Q12/Q12.txt +++ b/as/fe_tests/2011_06/Q12/Q12.txt @@ -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 に設定されて, 主プログラムから渡される。 @@ -12,3 +17,76 @@ (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 diff --git a/as/fe_tests/2011_06/Q12/call_rotate.casl b/as/fe_tests/2011_06/Q12/call_rotate.casl index 375e5db..40b6ef4 100644 --- a/as/fe_tests/2011_06/Q12/call_rotate.casl +++ b/as/fe_tests/2011_06/Q12/call_rotate.casl @@ -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 index 0000000..d4ed34f --- /dev/null +++ b/as/fe_tests/2011_06/Q12/call_rotate2.casl @@ -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 index 0000000..7b53ace --- /dev/null +++ b/as/fe_tests/2011_06/Q12/graph_five.casl @@ -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 index 0000000..4eebee2 --- /dev/null +++ b/as/fe_tests/2011_06/Q12/out_pbm.casl @@ -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 index 0000000..e615f35 --- /dev/null +++ b/as/fe_tests/2011_06/Q12/pbm16.casl @@ -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 diff --git a/as/fe_tests/2011_06/Q12/rotate.casl b/as/fe_tests/2011_06/Q12/rotate.casl index 6d33995..1ec2d29 100644 --- a/as/fe_tests/2011_06/Q12/rotate.casl +++ b/as/fe_tests/2011_06/Q12/rotate.casl @@ -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 index 0000000..d2d7061 --- /dev/null +++ b/as/fe_tests/2011_06/Q12/rotate2.casl @@ -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 -- 2.18.0