MAIN START RPUSH LD GR1,MIN ; GR1にMINを代入 LOOP CALL FIZBUZ ; FIZBUZを呼び出す LAD GR1,1,GR1 ; GR1 <- GR1 + 1 CPL GR1,MAX ; GR1とMAXを比較 JPL FIN ; GR1 > MAX の場合、FINへジャンプ 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」のフラグ GETFIZ LD GR2,FIZNUM ; GR2にFIZNUM=3を代入 CALL DIVL ; GR3 <- GR1 % 3(= GR2) LD GR3,GR3 ; GR3のフラグ値を取得 JNZ GETBUZ ; GR3が0でない場合、FIZNUMの倍数ではないので、GETBUZへジャンプ LD GR4,FIZLEN ; GR4に文字列「Fizz」の長さFIZLEN=4を代入 GETBUZ LD GR2,BUZNUM ; GR2にBUZNUM=5を代入 CALL DIVL ; GR3 <- GR1 % 5(= GR2) LD GR3,GR3 ; GR3のフラグ値を取得 JNZ PUTS ; GR3が0でない場合、BIZNUMの倍数ではないので、PUTSへジャンプ LD GR5,BUZLEN ; GR4のフラグ値を取得 PUTS LD GR6,GR4 ; GR6 <- GR4 AND GR6,GR5 ; GR6 <- GR6 and GR4 JZE CHKFIZ ; GR6が0の場合、GR4かGR5のどちらかが0なので、CHKFIZへジャンプ ADDL GR4,GR5 ; GR4 <- GR4 + GR5 JUMP PUTFIZ ; 「FizzBuzz」を出力するため、PUTFIZへジャンプ CHKFIZ LD GR4,GR4 ; GR4のフラグ値を取得 JZE CHKBUZ ; GR4が0の場合、CHKBUZへジャンプ PUTFIZ ST GR4,LEN ; LEN <- GR4 OUT FIZZ,LEN ;「Fizz」または「FizzBuzz」を出力 JUMP FIN ; FINへジャンプ CHKBUZ LD GR5,GR5 ; GR5のフラグ値を取得 JZE PUTNUM ; GR5が0の場合、PUTNUMへジャンプ PUTBUZ ST GR5,LEN ; LEN <- GR4 OUT BUZZ,LEN ;「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 LEN DS 1