基本情報技術者試験の過去問と解説
[TOP] [午前分野別] [午後分野別] [キーワード索引] [令和元年秋午前] [令和元年秋午後]

平成20年 春期 基本情報技術者 午後 問13
問13   CASL

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

〔プログラムの説明〕

(1) プログラム MAIN は,入力ファイル中の1〜3けたの数字列からなるレコードを 入力し,入力した数字列を 10 進数値とみなしたときの最大値,最小値及び 平均値を 10 進数の数字列で出力する。入力ファイルの例を図1に, このときの出力の例を図2に示す。

        
 図1 入力ファイルの例  図2 出力の例

 @ 0≦入力レコードの数値≦ 100 とする。

 A 1≦レコード数≦ 100 とする。

 B 平均値は小数点以下を切り捨てる。

(1) プログラム MAIN は,三つの副プログラム INPUT,DIVIDE 及び PRINT を使用する。

(2) 副プログラム INPUT は,入力ファイルからレコードを入力する。

 @ 入力したレコードの数字列を2進数に変換し,GR0 に設定して,主プログラムに戻る。

 A ファイルの終わりを検出した場合は,CRO に -1 を設定して,主プログラムに戻る。

 B 副プログラムから戻るとき,汎用レジスタ GR1 〜 GR7 の内容は元に戻す。

(4) 副プログラム DIVIDE は,除算を行う。

 @ 被除数は GR2 に,除数は GR1 に設定されて,主プログラムから渡される。
   GR1 >0,GR2 ≧0とする。

 A 商を GR3 に,剰余を GR2 に設定して,主プログラムに戻る。

 B 副プログラムは,GR2,GR3 以外の汎用レジスタの内容は変更しない。

(5) 副プログラム PRINT は,2進数nを3けたの 10 進数の数字列に変換して出力する。

 @ nは GR1 に設定されて,主プログラムから渡される。

 A 出力する数字列は右詰めにし,全体で3文字になるように左端から空白文字を補う。

 B 副プログラムから戻るとき,汎用レジスタ GR1 〜 GR7 の内容は元に戻す。

〔プログラム1〕

MAIN    START
        CALL    INPUT
        ST      GR0,MAX
        ST      GR0,MIN
        LD      GR2,GR0       ; 合計値を初期化
        LD      GR1,=1        ; カウンタを初期化
LOOP1   CALL    INPUT
        LD      GR0,GR0       ; 入力値
        JMI     FIN1          ; ファイルの終わり
        ADDA    GR2,GR0
        ADDA    GR1,=1
        CPA     GR0,MAX
        JPL     HIGH
        CPA     GR0,MIN
        JMI     LOW
        JUMP    LOOP1
HIGH    ST      GR0,MAX
        JUMP    LOOP1
LOW     ST      GR0,MIN 
        JUMP    LOOP1
FIN1    CALL    DIVIDE
        LD      GR1,MAX
        CALL    PRINT         ; 最大値を出力
        LD      GR1,MIN
        CALL    PRINT         ; 最小値を出力
         
        CALL    PRINT         ; 平均値を出力
        RET
MAX     DS      1
MIN     DS      1
        END

〔プログラム2〕 

INPUT   START
        RPUSH
        IN      IBUF,ILEN     ; レコードを入力
        LD      GR0,ILEN
        JMI     FIN2          ; ファイルの終わり
        LD      GR1,=0        ; けた数のカウンタ
        LD      GR4,=0        ; 数値の初期化
LOOP2   LD      GR3,IBUF,GR1
        AND     GR3,=#000F    ; 数字を数値に変換
        LD      GR5,GR4       ; GR4 の内容を 10 倍する。
                ;   
        SLL     GR4,1         ;   
        ADDA    GR4,GR5       ;   
        ADDA    GR4,GR3
        ADDA    GR1,=1
        CPA     GR1,GR0
        
        LD      GR0,GR4
FIN2    RPOP
        RET
ILEN    DS      1
IBUF    DS      256
        END

〔プログラム3〕

DIVIDE  START
        LD      GR3,=0       ; 商←0
LOOP3   CPA     GR2,GR1
         
        ADDA    GR3,=1
        SUBA    GR2,GR1
        JUMP    LOOP3
FIN3    RET
        END

〔プログラム4〕

PRINT   START
        RPUSH
        LD      GR4,=3          ; 出力けた数
        LD      GR2,GR1         ; 被除数←数値
        LD      GR1,=10         ; 除数← 10
LOOP4   CALL    DIVIDE          ; 数値 / 10
        OR      GR2,=#0030      ; 剰余を数字に変換
        SUBA    GR4,=1
        ST      GR2,OBUF,GR4
        LD      GR2,GR3         ; 被除数←商
                  ; 商=0?
        LD      GR2,=#0020      ; GR2 ←空白文字
LOOP5   SUBA    GR4,=1          ; 残りのけた位置に空白文字を入れる。
                  ;   
        ST      GR2,OBUF,GR4    ;   
        JUMP    LOOP5           ;   
FIN4    OUT     OBUF,OLEN
        RPOP
        RET
OLEN    DC      3
OBUF    DS      3
        END

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

a に関する解答群

ア LD  GR1,GR0       イ LD  GR1,GR2       ウ LD  GR1,GR3

エ LD  GR2,GR0       オ LD  GR2,GR1       カ LD  GR2,GR3

b に関する解答群

ア SLL  GR5,1       イ SLL  GR5,2      ウ SLL  GR5,3

エ SRL  GR5,1       オ SRL  GR5,2      カ SRL  GR5,3

c に関する解答群

ア JMI  FIN2       イ JMI  LOOP2

ウ JPL  FIN2       エ JPL  LOOP2

オ JZE  FIN2       カ JZE  LOOP2

d に関する解答群

ア JMI  FIN3       イ JNZ  FIN3

ウ JPL  FIN3       エ JZE  FIN3

e,f に関する解答群

ア JMI   FIN4       イ JMI  LOOP4

ウ JNZ   FIN4       エ JNZ  LOOP4

オ JPL   FIN4       カ JZE  LOOP4

解答 a ←クリックすると正解が表示されます

解答 b ←クリックすると正解が表示されます

解答 c ←クリックすると正解が表示されます

解答 d ←クリックすると正解が表示されます

解答 e ←クリックすると正解が表示されます

解答 f ←クリックすると正解が表示されます


[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]