非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

昔ながらの BASIC(7)

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

良さそうです。