MAIN START RPUSH LD GR1,MIN ; GR1にMINを代入 LOOP CALL FIZBUZ ; FIZBUZを呼び出す CPL GR1,MAX ; GR1とMAXを比較 JZE FIN ; GR1 = MAX の場合、FINへジャンプ LAD GR1,1,GR1 ; GR1 <- GR1 + 1 JUMP LOOP ; LOOPへジャンプ FIN RPOP RET MIN DC 1 MAX DC 100 ;; GR1の値に応じて次を出力 ;; 3の倍数: Fizz ;; 5の倍数: Buzz ;; 3の倍数かつ5の倍数: FizzBuzz ;; それ以外の数: 数値 FIZBUZ START RPUSH XOR GR4,GR4 ; GR4: 文字列「Fizz」の長さおよびフラグ XOR GR5,GR5 ; GR5: 文字列「Buzz」の長さおよびフラグ XOR GR6,GR6 ; GR6: 文字列「FizzBuzz」のフラグ LD GR2,FIZNUM ; GR2にFIZNUM=3を代入 CALL DIVL ; GR3 <- GR1 % 3(= GR2) LD GR4,GR3 ; GR4 <- GR3 LD GR2,BUZNUM ; GR2にBUZNUM=5を代入 CALL DIVL ; GR3 <- GR1 % 5(= GR2) LD GR5,GR3 ; GR5 <- GR3 LD GR6,GR4 ; GR6 <- GR4 or GR5 OR GR6,GR5 ; ↓ JNZ PUTFIZ ; GR6が0以外の場合、GR4かGR5のどちらかが0以外なので、PUTFIZへジャンプ OUT FIZZ,FBLEN ; 「FizzBuzz」を出力 JUMP FIN ; 「FizzBuzz」を出力するため、PUTFIZへジャンプ PUTFIZ LD GR4,GR4 ; GR4のフラグ値を取得 JNZ PUTBUZ ; GR4が0以外の場合、PUTBUZへジャンプ OUT FIZZ,FIZLEN ;「Fizz」を出力 JUMP FIN ; FINへジャンプ PUTBUZ LD GR5,GR5 ; GR5が0以外の場合、PUTNUMへジャンプ JNZ PUTNUM ; ↓ OUT BUZZ,BUZLEN ;「Buzz」を出力 JUMP FIN ; FINへジャンプ PUTNUM CALL OUTL ; GR1の数値を表示 FIN RPOP RET FIZNUM DC 3 BUZNUM DC 5 FIZZ DC 'Fizz' BUZZ DC 'Buzz' FIZLEN DC 4 BUZLEN DC 4 FBLEN DC 8