Z80 の例を参考に 8086 の例について考えます。『【電子復刻版】bit 1980年08月号(通巻138号)』の「16ビットマイクロプロセッサ8086」という記事に「8080 から 8086 へのプログラムの変換」という項目があったので Z80 から 8086 への変換にも使えそうです。『独習アセンブラ 新版』は主に 32 ビットのものを扱っているようですが使えるかもしれません。
8086 のフィボナッチ数列の例を変換した結果から
PUSH AX POP AX
は不要なので取り除くと以下のようになります。「CALL OUTPUT」で数値を出力できるものとします。
; フィボナッチ数列 MOV AX, 10 MOV [var_N], AX ; N = 10 MOV AX, 1 MOV [var_I], AX ; I = 1 MOV AX, 1 MOV [var_A], AX ; A = 1 MOV AX, 1 MOV [var_B], AX ; B = 1 LABEL_100: MOV AX, [var_A] PUSH AX CALL OUTPUT ; A を出力 MOV AX, [var_B] MOV [var_T], AX ; T = B LD HL, (var_A) MOV AX, [var_A] PUSH AX MOV AX, [var_B] PUSH AX POP BX POP AX ADD AX, BX PUSH AX POP AX MOV [var_B], AX ; B = A + B MOV AX, [var_T] MOV [var_A], AX ; A = T MOV AX, [var_I] PUSH AX MOV AX, 1 PUSH AX POP BX POP AX ADD AX, BX MOV [var_I], AX ; I = I + 1 MOV AX, [var_I] PUSH AX MOV AX, [var_N] PUSH AX POP BX ; BX = N POP AX ; AX = I CMP AX, BX ; I と N を比較 JLE CMP_TRUE_0 ; I <= N のとき CMP_TRUE_0 へ MOV AX, 0 PUSH AX ; I - N <= 0 ではないときスタックに 0 を PUSH JMP CMP_END_0 ; CMP_END_0 へ CMP_TRUE_0: MOV AX, 1 PUSH AX ; I - N <= 0 のときスタックに 1 を PUSH CMP_END_0: POP AX CMP AX, 0 ; AX が 0 かどうかを調べる JNE LABEL_100 ; I - N <= 0 のとき LABEL_100 へ ; 本来はここで終了 DATA SEGMENT var_N DW 0 var_A DW 0 var_I DW 0 var_B DW 0 var_T DW 0 DATA ENDS
良さそうです。