PUSH HL POP HL
は不要なので取り除くと以下のようになります。「CALL OUTPUT」で数値を出力できるものとします。
; フィボナッチ数列 LD HL, 10 LD (var_N), HL ; N = 10 LD HL, 1 LD (var_I), HL ; I = 1 LD HL, 1 LD (var_A), HL ; A = 1 LD HL, 1 LD (var_B), HL ; B = 1 LABEL_100: LD HL, (var_A) PUSH HL CALL OUTPUT ; A を出力 LD HL, (var_B) LD (var_T), HL ; T = B LD HL, (var_A) PUSH HL LD HL, (var_B) PUSH HL POP DE POP HL ADD HL, DE LD (var_B), HL ; B = A + B LD HL, (var_T) LD (var_A), HL ; A = T LD HL, (var_I) PUSH HL LD HL, 1 PUSH HL POP DE POP HL ADD HL, DE LD (var_I), HL ; I = I + 1 LD HL, (var_I) PUSH HL LD HL, (var_N) PUSH HL POP DE ; DE = N POP HL ; HL = I OR A ; キャリーフラグをクリア SBC HL, DE ; I - N を計算 JP Z CMP_TRUE_0 ; 0 のとき CMP_TRUE_0 へ JP M CMP_TRUE_0 ; 負のとき CMP_TRUE_0 へ LD HL, 0 PUSH HL ; I - N <= 0 ではないときスタックに 0 を PUSH JP CMP_END_0 ; CMP_END_0 へ CMP_TRUE_0: LD HL, 1 PUSH HL ; I - N <= 0 のときスタックに 1 を PUSH CMP_END_0: POP HL ; HL は I - N <= 0 のとき 1、そうではないとき 0 LD A, H OR L ; HL が 0 かどうかを調べる JP NZ, LABEL_100 ; I - N <= 0 のとき LABEL_100 へ ; 本来はここで終了 ; --- Variable Declarations --- var_N: DW 0 var_A: DW 0 var_I: DW 0 var_B: DW 0 var_T: DW 0
良さそうです。








