例題 (第3回目)

次の2つのプログラムを実行し,動作確認をせよ。

  例題7 サブルーチンの例題

鶴と亀の合計数が10で,合計の足数が26のとき,鶴と亀の匹数を印刷しなさい。ただし,10進数に変換する部分はサブルーチンとすること。

 ヒント:鶴と亀の数は,次式の関係がある。
     亀の匹数=(足の総数-2×頭の総数)÷2
     鶴の羽数=頭の総数-亀の匹数

;-------------------------
; 例7 鶴亀算 (サブルーチンの使い方)
;-------------------------
EX7    START
       LD      GR0,ASI
       SUBA    GR0,ATAMA
       SUBA    GR0,ATAMA       ;足の総数‐頭の総数×2
       SRA     GR0,1           ;÷2
       ST      GR0,KAME
       LAD     GR1,6           ;亀桁位置設定
       CALL    DECCNV          ;10進数に変換
       LD      GR0,ATAMA
       SUBA    GR0,KAME
       LAD     GR1,23          ;鶴桁位置設定
       CALL    DECCNV          ;10進数に変換
       OUT     OBUF,OLEN
       RET
ATAMA  DC      10
ASI    DC      26
KAME   DS      1
OBUF   DC      'KAME        HIKI:TURU        WA'
OLEN   DC      31
;
;SUBROUTINE (10進数に変換)
DECCNV LAD     GR3,0           ;文字列を数えるループカウンタ
LOOP1  LAD     GR2,-1          ;商のカウンタ
LOOP2  LAD     GR2,1,GR2       ;商のカウンタ+1
       SUBA    GR0,CONST,GR3
       JPL     LOOP2
       JZE     LOOP2
       ADDA    GR0,CONST,GR3   ;GR0←(GR0)+(CONST+GR3)
       ADDA    GR2,ZONE        ;ゾーン部付加
       ST      GR2,OBUF,GR1
       LAD     GR1,1,GR1       ;桁位置のポインタ+1
       LAD     GR3,1,GR3       ;ループのカウンタ+1
       CPA     GR3,F5
       JMI     LOOP1           ;終り?
       RET
ZONE   DC      '0'
CONST  DC      10000,1000,100,10,1
F5     DC      5
       END
   例題8 奇数の合計

1から100までの奇数の合計を10進数で「SUM OF ODD NUMBERS = 02500」のように印刷しなさい。 ただし,10進数に変換する部分はサブルーチンとすること。

;---------------------------
; 例8 奇数の合計
;---------------------------
EX8     START
        LAD    GR0,0           ;合計を格納するレジスタGR0 ← 0
        LAD    GR1,1           ;奇数を格納するレジスタGR1 ← 1
LOOP    ADDA   GR0,GR1         ;GR0 ← ( GR0 + GR1 )
        LAD    GR1,2,GR1       ;GR1 ← 2 + GR1
        CPA    GR1,F100        ;GR1とF100を比較 (GR1) - (F100)
        JMI    LOOP            ;比較結果が <0 ならLOOP へ分岐
        JZE    LOOP            ;比較結果が =0 ならLOOP へ分岐
        LAD    GR1,16          ;GR1 ← 16
        CALL   DECPRT          ;10進数に変換
        RET
F100    DC     100
;
;SUBROUTINE (10進数に変換)
DECPRT  LAD    GR3,0           ; GR3 ← 0
LOOP1   LAD    GR2,-1          ; GR2 ← -1
LOOP2   LAD    GR2,1,GR2       ; GR2 ← 1 + GR2
        SUBA   GR0,CONST,GR3   ; GR0 ← ( GR0 ) - ( CONST + GR3 )
        JPL    LOOP2           ; 減算結果が >0 ならLOOP へ分岐
        JZE    LOOP2           ; 減算結果が =0 ならLOOP2 へ分岐
        ADDA   GR0,CONST,GR3   ; GR0 ← ( GR0 ) + ( CONST + GR3 )
        ADDA   GR2,ZONE        ; GR2 ← ( GR2 ) + ( ZONE )
        ST     GR2,OUTBUF,GR1  ; GR2を(OUTBUF + GR1)番地に格納
        LAD    GR1,1,GR1       ; GR1 ← 1 + GR1
        LAD    GR3,1,GR3       ; GR3 ← 1 + GR3
        CPA    GR3,F5          ; GR3とF5を比較 (GR3)-(F5)
        JMI    LOOP1           ; 比較結果が <0 ならLOOP1 へ分岐
        OUT    OUTBUF,OUTLEN   ; 文字を出力する
        RET
ZONE    DC     '0'
OUTBUF  DC     'SUM OF ODD NUM=      '
OUTLEN  DC     21
CONST   DC     10000,1000,100,10,1
F5      DC     5
        END

図1:例題8のメインルーチンのフローチャート

 練習課題

 例題を参考プログラムを作成せよ。

   必須課題 素数判定

1. 与えられた数nが素数か否かを判定するプログラムを作成せよ。 ただし,nがmで割り切れるか否かの判定を行う部分はサブルーチンとすること。

2. このプログラムにおける,メインルーチンからサブルーチンへの情報の渡し方について説明せよ。

ヒント:

   オプション課題 10進数のソート

データ領域(DATA番地)に記憶されている正の10進数のデータを, 小さなものから大きなものの順(昇順という)にソートするプログラムを作成しなさい。 ただし,データを印刷する部分および10進数に変換する部分はサブルーチンとすること。

 ヒント:フローチャートの例を下図に示す。DECCNVでもGR2,GR3を使うので,それらをスタックに退避するよう改良する必要がある。

 図2:課題8のメインルーチンおよびサブルーチンのフローチャート