例題 (第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のメインルーチンのフローチャート
課題 (第3回目) |
例題を参考に課題6~7のプログラムを作成せよ。
課題7 素数判定 1. 与えられた数nが素数か否かを判定するプログラムを作成せよ。 ただし,nがmで割り切れるか否かの判定を行う部分はサブルーチンとすること。
2. このプログラムにおける,メインルーチンからサブルーチンへの情報の渡し方について説明せよ。
ヒント:
- 素数は,1より大きい整数で,1とその数自身以外に約数をもたない (例:2,3,5,7,…)
- 与えられた数nをm (1 < m < n) で割った余りが0ならば,nは素数ではない
- 割り算は減算を用いて実現できる
(例6の10進数の印刷を参照。GR1から10000を何回引くと負になるかを調べていた。 これはGR1を10000で割り算していることと同じ。 GR1に23542が格納されている場合,10000を2回引けるので,商は2,余りは3542)
課題8 10進数のソート データ領域(DATA番地)に記憶されている正の10進数のデータを, 小さなものから大きなものの順(昇順という)にソートするプログラムを作成しなさい。 ただし,データを印刷する部分および10進数に変換する部分はサブルーチンとすること。
ヒント:フローチャートの例を下図に示す。DECCNVでもGR2,GR3を使うので,それらをスタックに退避するよう改良する必要がある。
図2:課題8のメインルーチンのフローチャート 図3:課題8のサブルーチンのフローチャート