TITLE SUMOF
                                ; x=M〜Nの範囲でf(x)=A*x+Bを計算し、

                                ; その合計を求めるプログラム

                                ; (機械語プログラム版)

                                ;

        ORG 200                        ; 0x200より入力データ開始

A:        DC 2                        ; A=2

B:        DC 1                        ; B=1

M:        DC 0                        ; M=0

N:        DC 5                        ; N=5

        ORG 210                        ; 0x210より命令コード開始

START:        L  1,M
        ST 1,X                        ; X=M (==0)

        LA 2,YDATA
        ST 2,YADDR                ; YDATAのアドレスをYADDRに格納する

                                ; f(x)=A*x+Bを x=M〜Nの範囲で求めるループ

LOOP:        L  1,X
        L  2,N
        CMP 1,(2)                ; XとNを比較する

        BP NEXT                        ; XがNより大きい場合はループを抜ける

        BSR FUNC                ; f(x)を計算するサブルーチンを呼び出す

                                ; r1にXの値をセットしてから呼び出す

                                ; r1に計算結果が返ってくる

        L  2,YADDR
        STX 1,(2)                ; YADDRのアドレスに結果を格納する

        LEA 2,1(2)                ; YADDR++

        ST 2,YADDR
        L  1,X
        LEA 1,1(1)                ; X++

        ST 1,X
        B  LOOP
                                ;

NEXT:        L  1,M
        ST 1,X
        LA 2,YDATA
        ST 2,YADDR                ; YDATAのアドレスを(再び)YADDRに格納する

                                ;

                                ; YDATA[]に格納されている値を合計するループ

LOOP2:  L  1,X
        L  2,N
        CMP 1,(2)                ; XとNを比較する

        BP FIN                        ; XがNより大きい場合にはループを抜ける

        L  2,YADDR
        LX 2,(2)                ; 現在のYADDRのアドレスから値を読み出す

        L  1,SUM
        ADD 1,(2)                ; SUMに加算する

        ST 1,SUM
        L  2,YADDR
        LEA 2,1(2)                ; YADDR++

        ST 2,YADDR
        L  1,X
        LEA 1,1(1)                ; X++

        ST 1,X
        B  LOOP2
                                ;

FIN:    HLT                        ; プログラム停止

                                ;

FUNC:   L  2,A                        ; f(x)=A*x+B を計算するサブルーチン

                                ; r1にxの値をセットして呼び出す

                                ; r1に計算結果を格納して戻る

        MULT 1,(2)                ; A*xを計算する

        L  3,B
        ADD 3,(2)                ; A*x+Bの値がr3に格納されている

        LEA 1,(3)                ; r1にr3の値をコピーする

        RET                        ; 呼び出し元に戻る

                                ;

X:        DS 1                        ; 現在のxの値 (作業用)

YADDR:        DS 1                        ; 現在のYDATA[]の位置 (作業用)

YDATA:        DS 10                        ; 各xに対応したf(x)の計算結果を格納

SUM:        DC 0                        ; 計算結果

        END