Hatena::Groupjnote

Jnote/コンピュータ用語/漢字の語源 このページをアンテナに追加 RSSフィード

 | 

2006-06-13(火)

[]「漢字検定2級書き取り編」 「漢字検定2級書き取り編」 - Jnote/コンピュータ用語/漢字の語源 を含むブックマーク はてなブックマーク - 「漢字検定2級書き取り編」 - Jnote/コンピュータ用語/漢字の語源 「漢字検定2級書き取り編」 - Jnote/コンピュータ用語/漢字の語源 のブックマークコメント

今日の解説

フヨウ:年老いた両親を「扶養」(フヨウ)する。(漢検2級(G) H17-3-(6)-03)

本日の問題 左のカタカナを漢字(と送りがな)に直しましょう。

フヨウ:景気のフヨウ作を講じる。

思い出そう

「競」部首は?

[]第7号発行しました。 第7号発行しました。 - Jnote/コンピュータ用語/漢字の語源 を含むブックマーク はてなブックマーク - 第7号発行しました。 - Jnote/コンピュータ用語/漢字の語源 第7号発行しました。 - Jnote/コンピュータ用語/漢字の語源 のブックマークコメント

この号から,過去問題の解説を開始しました。過去問題の解説は,まぐまぐのプレミヤ版で出す予定でしたが,プレミア版の発行準備が遅れて居るため,しばらくは無料版の方で書くことにします。

合格☆CASLは,まぐまぐから発行してます。

登録↓

http://http://www.mag2.com/m/0000188844.html


┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 合格☆CASL(無料)                .&&&& **** %%%%. ┃
┃                         &&&&&&******%%%%%% ┃
┃ 発行 斎藤末広 jwork2006@yscon.co.jp @は半角 '&┃&''*┃*''%┃%' ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━┻━━┻━━┛

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓

 第7号 2006/06/13 毎週火曜発行

 平成18年春問09解説
 長方形の面積を求める。

┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

目次

▼ 過去問題に挑戦
▼ 午後問題を要約する
▼ 「副プログラム」とは
▼ RPUSH,RPOP 命令と GR0 の役割
▼ 設問の順に解く,設問の解答群を分析
▼ 設問1 a,b
▼ CALL と RET 命令
▼ かけ算のパターン
▼ CASL のかけ算プログラム
▼ 絶対値を求める 設問1 c
▼ 設問2
▼ 完成プログラム
▼ この号で勉強したこと

=========================================================================
▼ 過去問題に挑戦

 前号までで,CASL の命令解説は8割方終了しました。この号からは,過去問題
を解説しながら,CASLプログラム読み取りに慣れていきたいと思います。まだ
説明してない命令はそのつど説明をしてきます。

 CASL の過去問題に挑戦するには,以下の2つの前提をクリアしていたらOK
です。

 1 CASL の基本的な文法を知っているです。

 2 CASL 以外の,プログラム言語の半日程度の経験

 1に関しては,この「合格☆CASL」の試験直前号の第3号をのぞいた他の号
を読んでもらったら十分です。

 プログラム作成の経験がない方は,エクセルのマクロ入門等で半日程度,学習
してください。

 この号では,平成18年春問09を扱います。

 試験問題は
 基本情報技術者試験午後問09のみ(HTML形式)
 http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H18a2/pm09.html

 基本情報技術者試験午後全部(PDF形式)
 http://www.jitec.jp/1_04hanni_sukiru/18haru_qs_ans/2006h18h_fe_pm_qs.pdf

 でみることができます。印刷してください。上のHTML形式の方であれば,
2ページに収まります。

 まずは,問題をざっとみて,どんな問題か,ひと言で言って下さい。

   ┏---------------------------------------------------------┓

    午後問題は,ひと言で要約する

   ┗---------------------------------------------------------┛

========================================================================
▼ 午後問題を要約する

 問題文と設問をざっと見て,問題を要約しましょう。できるだけ,短い言葉で
説明します。

 基本情報技術者試験午後問09
 http://www.rs.kagu.sut.ac.jp/~infoserv/j-siken/H18a2/pm09.html

 平成18年春午後問09は,ひと言でいうと,「長方形の面積を求める」問題
です。まずはこれだけで十分です。

 さらに,この問題を見ると,A点とB点できまる長方形の問題で,点の座標
を単純に計算をすると,マイナスになることがあるので,絶対値をとるという
ロジックがあることが分かります。

========================================================================
▼ 「副プログラム」とは

┏--------------------------------------------------------------------┓

問9 次のアセンブラプログラムの説明及びプログラムを読んで,設問1,2に
答えよ。

〔プログラムの説明〕

(1) 副プログラム OBLONG は,各座標値が整数である 2 点 A(x1,y1),
B(x2,y2)を対角の頂点とし,各辺が x 軸又は y 軸に平行な長方形の面積を
求めるプログラムである。

┗--------------------------------------------------------------------┛

と問題が始まります。ここに登場する「副プログラム」とは,別のプログラム
から呼び出されて利用されるという意味です。他の言語では,関数,メソッド,
サブルーチンと呼ばれるものです。

========================================================================
▼ RPUSH,RPOP 命令と GR0 の役割

プログラムの最初のところの

┏--------------------------------------------------------------------┓

 1  OBLONG  START
 2          RPUSH
 3          LD    GR2,0,GR1  ;GR3←|x1-x2|

┗--------------------------------------------------------------------┛

 にある,RPUSH は,レジスタを保存するという命令です。GR0 をのぞいた汎用
レジスタ GR1 から GR7 値が保存されます。このプログラムは,他のプログラム
から呼び出されて使用されるプログラムということですので,レジストの値を
変した場合に元に戻して,終了した方がよいです。そのために,いったん保存
し,あとので復元します。復元は以下のところにあります。

 このプログラムの下の方の

┏--------------------------------------------------------------------┓

17          JUMP  LOOP
18  FIN1    RPOP
19          RET

┗--------------------------------------------------------------------┛

 に登場する,RPOP が,復元の命令です。保存してあったレジスタの値を復元
GR0 をのぞいた汎用レジスタ,GR1からGR7まで,復元します。

 RPUSH と RPOP と  GR0 をのぞいて,保存,復元します。そのため,GR0 は,
呼び出す側と呼び出される側のプログラムでやりとに簡単に使うことができます。

   ┏---------------------------------------------------------┓

    GR0 は,結果保存用の レジスタ

   ┗---------------------------------------------------------┛

となり,GR0は,親プログラムに答えを返すのによく使われます。

========================================================================
▼ 設問の順に解く,設問の解答群を分析

 情報処理技術者試験の午後問題は,問題文の中では,設問の順に解くと自然に
解けるように作成されています。問題文をざっと見たら,設問を注意深くみて
問題に挑戦します。

   ┏---------------------------------------------------------┓

    設問の順で解く

   ┗---------------------------------------------------------┛

========================================================================
▼ 設問1 a,b

 ではさっそく設問1から解いていきましょう。

┏--------------------------------------------------------------------┓

設問1 プログラム中の  に入れる正しい答えを,解答群の中から選べ。

a,b に関する解答群

 ア JMI ADD      イ JMI LOOP      ウ JMI SHIFT
 エ JOV ADD      オ JOV LOOP      カ JOV SHIFT
 キ JUMP ADD      ク JUMP LOOP      ケ JUMP SHIFT

┗--------------------------------------------------------------------┛

「a, b に関する解答群」は全て ジャップ命令で,ジャンプ先は,ADD,LOOP,
SHIFT のラベルのどれかです。ここで,プログラムを見てみましょう。

┏--------------------------------------------------------------------┓

 1  OBLONG  START
 2          RPUSH
 3          LD    GR2,0,GR1  ;GR3←|x1-x2|
 4          SUBA  GR2,2,GR1  ;  ”
 5          CALL  ABS        ;  ”
 6          LD    GR3,GR2    ;  ”
 7          LD    GR2,1,GR1  ;GR2←|y1-y2|
 8          SUBA  GR2,3,GR1  ;  ”
 9          CALL  ABS        ;  ”
10          LD    GR0,=0     ; 面積の初期化
11  LOOP    SRL   GR2,1
12         [       a        ]
13          JZE   FIN1
14         [       b        ]
15  ADD     ADDA  GR0,GR3
16  SHIFT   SLA   GR3,1
17          JUMP  LOOP
18  FIN1    RPOP
19          RET

┗--------------------------------------------------------------------┛

3行目の

┏--------------------------------------------------------------------┓

 3          LD    GR2,0,GR1  ;GR3←|x1-x2|

┗--------------------------------------------------------------------┛

 の ;GR3←|x1-x2| は,プログラム用語では,コメントといいます。プログラ
ムの説明が書いてあります。これは,人間用に書いてあるだけです。

   ┏---------------------------------------------------------┓

    コメントはプログラムを人間のためメモ。コンピュータは無視

   ┗---------------------------------------------------------┛

 3          LD    GR2,0,GR1  ;GR3←|x1-x2|
 4          SUBA  GR2,2,GR1  ;  ”
 5          CALL  ABS        ;  ”
 6          LD    GR3,GR2    ;  ”
 7          LD    GR2,1,GR1  ;GR2←|y1-y2|
 8          SUBA  GR2,3,GR1  ;  ”
 9          CALL  ABS        ;  ”

 の ;の後ろだけ見ると,GR3 と GR2 に2つの辺の長さを入れていることが
想像できます。

   ┏---------------------------------------------------------┓

    レジスタの役割を見抜く

   ┗---------------------------------------------------------┛

   ┏---------------------------------------------------------┓

    コメントは読む

   ┗---------------------------------------------------------┛

┏--------------------------------------------------------------------┓

10          LD    GR0,=0     ; 面積の初期化

┗--------------------------------------------------------------------┛

 のコメントで,GR3 * GR2 → GR0 と計算されると予想できます。

   ┏---------------------------------------------------------┓

    GR0 は,結果保存用の レジスタ

   ┗---------------------------------------------------------┛

でしたね。

========================================================================
▼ CALL と RET 命令

┏--------------------------------------------------------------------┓

 5          CALL  ABS        ;  ”

┗--------------------------------------------------------------------┛

と CALL 命令があります。これは,ここで,別のプログラムを読み出すという
意味です。ABS というプログラムを実行して,ABS プログラムの実行が終わった
ら,ここに戻っていきます。

ABS プログラムとは

┏--------------------------------------------------------------------┓

21  ABS     LD    GR0,GR2
22          JMI   MINUS
23          JUMP  FIN2
24  MINUS   LD    GR2,=0
12         [       c        ]
26  FIN2    RET

┗--------------------------------------------------------------------┛

です。26 行目に,FIN 2  RET とあります。この RET は,戻るという意味で,
先ほどの CALL に対応する命令です。CALL されたところに RET します。

   ┏---------------------------------------------------------┓

    CALL 命令:副プログラムを実行する。

   ┗---------------------------------------------------------┛

   ┏---------------------------------------------------------┓

    RET 命令:呼び出したプログラムに戻る。

   ┗---------------------------------------------------------┛

========================================================================
▼ かけ算のパターン

 このプログラムでは面積の計算をするので,かけ算をするはずです。CASL には
かけ算の命令がありません。かけ算をするときはどうやるでしょうか?

 例えば,3×5を計算するときに,もちろん,3を5回足すというやり方でも
計算できます。しかし,CASL では,かけ算は,シフトを利用して行うのが普通
です。

 例えば,5倍するときは,2ビット左シフトして,4倍を作り,それにそれ自身
を足して5倍とします。

 3 × 5 = 3 ×(4 + 1)
     = 3 ×4 +  3 ×1

と考えます。

   ┏---------------------------------------------------------┓

    かけ算は,シフト命令を利用。1ビットシフトで2倍。

   ┗---------------------------------------------------------┛

 5 が,(4 +1)に分かれることは,5 を 2 進数に変換すれば,すぐに分かります。

5 の 2 進数   1 0 1
         (4 2 1 の位)

4 の位と,1 の位に,1 がありますので,5 = (4 + 1) であることが分かります。

========================================================================
▼ CASL のかけ算プログラム

 かけ算をしているところは,

┏--------------------------------------------------------------------┓

10          LD    GR0,=0     ; 面積の初期化
11  LOOP    SRL   GR2,1
12         [       a        ]
13          JZE   FIN1
14         [       b        ]
15  ADD     ADDA  GR0,GR3
16  SHIFT   SLA   GR3,1
17          JUMP  LOOP
18  FIN1    RPOP
19          RET

┗--------------------------------------------------------------------┛

であることがだいたい分かります。ここで,GR2 × GR3 → GR0 をしているはず
です。

上の数字の例でいうと

 3 × 5 = 3 ×(4 + 1)
     = 3 ×4 +  3 ×1
というロジックを利用しています。3 に当たるのは,GR2 でしょうか? GR3 で
しょうか? これは,左シフトの対象になっているかどうかで分かります。

16  SHIFT   SLA   GR3,1

 で,GR3 が,3 × 5 の 3 にあたる数字であることが分かります。

 GR3 × GR2    GR3
 3   × 5   = 3    ×(4 + 1)
         = 3×4 + 3×1

です。

 ここで,GR2 が,1 だったら,

15  ADD     ADDA  GR0,GR3

を1回だけやって終了するはずです。GR2 が,1 のとき

12         [       a        ]

は,ジャンプして,

15  ADD     ADDA  GR0,GR3

にいくはずです。GR2 が 1 の時,15 行目にジャンプするのは,どの命令かは
解答群から選びましょう。

┏--------------------------------------------------------------------┓

a,b に関する解答群

 ア JMI ADD      イ JMI LOOP      ウ JMI SHIFT
 エ JOV ADD      オ JOV LOOP      カ JOV SHIFT
 キ JUMP ADD      ク JUMP LOOP      ケ JUMP SHIFT

┗--------------------------------------------------------------------┛

の中では,エの

 JOV ADD

です。

 GR2: 0000 0000 0000 0001

 これを SRL GR2,1 すると

 GR2: 0000 0000 0000 0000 となり,オーバーフラグに 1 がたちます。
シフト命令は,シフトして外に出たビットの値が,オーバーフラグに設定
されるます。

[ a ]は,JOV ADD と分かったので,[ a ]のところに入れます。

┏--------------------------------------------------------------------┓

10          LD    GR0,=0     ; 面積の初期化
11  LOOP    SRL   GR2,1
12          JOV   ADD        ; 空欄a
13          JZE   FIN1
14         [       b        ]
15  ADD     ADDA  GR0,GR3
16  SHIFT   SLA   GR3,1
17          JUMP  LOOP
18  FIN1    RPOP
19          RET

┗--------------------------------------------------------------------┛

3 × 1 を計算するとして,現在,GR2 は,左に 1 シフトされたので,GR2 は
ゼロです。

15 行目を実行して,GR0 は,0 + 3 → GR0 で,3 となっています。
16 行目を実行すると,GR3 左シフトで,3 が 6 になります。
17 行目で,JUMP LOOP で,11 行目に戻ります。
11 行目を実行しても,GR2 は,0 のままで変化なし
12 行目は動作せず
13 行目で,フラグレジスタには,11 行目の演算結果のゼロが設定されているので
JZE FIN1 で,18行目に行き終了します。

ここで,最初 GR2 が 5 であれば,

 GR3 × GR2    GR3
 3   × 5   = 3    ×(4 + 1)
         = 3×4 + 3×1

で,3 ×4 と 3×1は加算しますが,3×2 は加算しません。つまり

 GR3 × GR2    GR3
 3   × 5   = 3    ×(4 + 1)
         = 3×4×1 + 3×2×0 + 3×1×1
                          ~~~~~~~
と考えることができます。

┏--------------------------------------------------------------------┓

14         [       b        ]
15  ADD     ADDA  GR0,GR3
16  SHIFT   SLA   GR3,1
17          JUMP  LOOP
18  FIN1    RPOP

┗--------------------------------------------------------------------┛

 14 行目の役割は,下の ADDA をしないようにすることなので,

 単純な JUMP で,行き先は,16 行目になります。

┏--------------------------------------------------------------------┓

10          LD    GR0,=0     ; 面積の初期化
11  LOOP    SRL   GR2,1
12          JOV   ADD        ; 空欄a
13          JZE   FIN1
14          JUMP  SHIFT      ; 空欄b
15  ADD     ADDA  GR0,GR3
16  SHIFT   SLA   GR3,1
17          JUMP  LOOP
18  FIN1    RPOP
19          RET

┗--------------------------------------------------------------------┛

です。

 GR3 × GR2    GR3
 3   × 5   = 3    ×(4 + 1)
         = 3×4×1 + 3×2×0 + 3×1×1

は,正確に書くと,つぎのように計算しています。

 GR3 × GR2    GR3
 3   × 5   = 3×*1 + 1)
                             ↑ ↑  ↑
               1   0     1
                    ↑ここで,GR0 に 3 を加えた
                 ↑ここでは,GR0 には何も足し込みをせず
               ↑ここで,GR0 に,12(=3×4) を加えた。

========================================================================
▼ 絶対値を求める

┏--------------------------------------------------------------------┓

21  ABS     LD    GR0,GR2
22          JMI   MINUS
23          JUMP  FIN2
24  MINUS   LD    GR2,=0
25         [       c        ]
26  FIN2    RET

┗--------------------------------------------------------------------┛

 では,絶対値を求めています。なお,21 行目の ABS は,エクセルの関数名
でおなじみのABSで,絶対値にする関数名です。

 GR2 がプラスの数値ならそのまま,マイナスの数値なら,プラスにします。

マイナス時は,

┏--------------------------------------------------------------------┓

24  MINUS   LD    GR2,=0
25         [       c        ]

┗--------------------------------------------------------------------┛

この2行でプラスにします。cに関する解答群をみましょう。

┏--------------------------------------------------------------------┓

c に関する解答群

 ア ADDA GR0,GR2      イ ADDA GR2,GR0
 ウ SUBA GR0,GR2      エ SUBA GR2,GR0

┗--------------------------------------------------------------------┛

21 で,GR0 には,もとに数値が入っていますので,それがマイナスですので,

 0    - (マイナスの数値) → プラスの数値
 GR2         GR0             GR2

 SUBA GR2,GR0

となります。つまり,エです。

========================================================================
▼ 設問2

┏--------------------------------------------------------------------┓

設問2 2 点 A と B に次の座標を与えたとき,行番号 15 の ADDA 命令は何回
実行されるか。正しい答えを,解答群の中から選べ。

   Aの座標:(3,6)
   Bの座標:(-5,17)

解答群
 ア 1
 イ 2
 ウ 3
 エ 4
 オ 5

┗--------------------------------------------------------------------┛

A と B で作る長方形の大きさは,8×11 となります。

 GR3 × GR2    GR3
 3   × 5   = 3×*2 + 1)
                             ↑ ↑  ↑
               1   0     1
                             (2進数の5)

を参考にして考えると

 GR3 × GR2    GR3
 8   × 11   = 8×(((2×(2×((2×1) +0)+ 1) + 1)

                     1   0   1    1
                                    (2進数の11)

11 を2 進数にしたときの 1 の数だけ

12          JOV   ADD        ; 空欄a

を実行しますので,15行目を実行する回数は,3 となります。
これで解けました。

========================================================================
▼ 完成プログラム

空欄を埋め,さらに実行可能のプログラムは以下のようになります。

 1  OBLONG  START
 2          RPUSH
 3          LD    GR2,0,GR1  ;GR3←|x1-x2|
 4          SUBA  GR2,2,GR1  ;  ”
 5          CALL  ABS        ;  ”
 6          LD    GR3,GR2    ;  ”
 7          LD    GR2,1,GR1  ;GR2←|y1-y2|
 8          SUBA  GR2,3,GR1  ;  ”
 9          CALL  ABS        ;  ”
10          LD    GR0,=0     ; 面積の初期化
11  LOOP    SRL   GR2,1
12          JOV   ADD        ; 空欄a
13          JZE   FIN1
14          JUMP  SHIFT      ; 空欄b
15  ADD     ADDA  GR0,GR3
16  SHIFT   SLA   GR3,1
17          JUMP  LOOP
18  FIN1    RPOP
19          RET
20  ;
21  ABS     LD    GR0,GR2
22          JMI   MINUS
23          JUMP  FIN2
24  MINUS   LD    GR2,=0
14          SUBA  GR2,GR0    ; 空欄c
26  FIN2    RET
27          END

となります。

以下のように仮の呼出プログラムをつけると実行可能です。面積の答えは,XANS
に保存されます。

ソース保存 http://www.yscon.co.jp/j/mag/casl/src/X18409.CAS
X18409  START
        LAD   GR1,XDATA
        CALL  OBLONG
        ST    GR0,XANS
        RET
;
XDATA   DC    3          ;点A X1
        DC    6          ;    Y1
        DC    -5         ;点B X2
        DC    17         ;    Y2
;
XANS    DS    1
        END
;
OBLONG  START
        RPUSH
        LD    GR2,0,GR1  ;GR3←|x1-x2|
        SUBA  GR2,2,GR1  ;  ”
        CALL  ABS        ;  ”
        LD    GR3,GR2    ;  ”
        LD    GR2,1,GR1  ;GR2←|y1-y2|
        SUBA  GR2,3,GR1  ;  ”
        CALL  ABS        ;  ”
        LD    GR0,=0     ; 面積の初期化
LOOP    SRL   GR2,1
        JOV   ADD        ; 空欄a
        JZE   FIN1
        JUMP  SHIFT      ; 空欄b
ADD     ADDA  GR0,GR3
SHIFT   SLA   GR3,1
        JUMP  LOOP
FIN1    RPOP
        RET
;
ABS     LD    GR0,GR2
        JMI   MINUS
        JUMP  FIN2
MINUS   LD    GR2,=0
        SUBA  GR2,GR0    ; 空欄c
FIN2    RET

------------------------------------------------------------------------
▼ この号で,勉強したこと

 命令:
 RPUSH,PPOP,CALL, RET 命令

 用語:
 コメント

 パターン:
 かけ算,絶対値(符号反転)

------------------------------------------------------------------------
▼ アンケート(以下を返信して下さい)

あなたの名前(ハンドル名):

この号は,よかった?(1から5)

その他

*1:2×((2×1) +0

*2:2×((2×1) +0

 |