                       TITLE SUMOF
                       ; x=M〜Nの範囲でf(x)=A*x+Bを計算し、
                       ; その合計を求めるプログラム
                       ; (機械語プログラム版)
                       ;
                       ORG   200         ; 0x200より入力データ開始
  0200 0002    A:      DC    2           ; A=2
  0201 0001    B:      DC    1           ; B=1
  0202 0000    M:      DC    0           ; M=0
  0203 0005    N:      DC    5           ; N=5
                       ORG   210         ; 0x210より命令コード開始
  0210 9 01 F2 START:  L     1,M
  0211 9 11 2B         ST    1,X         ; X=M (==0)
  0212 9 22 2C         LA    2,YDATA
  0213 9 12 2A         ST    2,YADDR     ; YDATAのアドレスをYADDRに格納する
                       ; f(x)=A*x+Bを x=M〜Nの範囲で求めるループ
  0214 9 01 28 LOOP:   L     1,X
  0215 9 02 EE         L     2,N
  0216 8 21 00         CMP   1,(2)       ; XとNを比較する
  0217 E 00 0A         BP    NEXT        ; XがNより大きい場合はループを抜ける
  0218 E 22 1E         BSR   FUNC        ; f(x)を計算するサブルーチンを呼び出す
                       ; r1にXの値をセットしてから呼び出す
                       ; r1に計算結果が返ってくる
  0219 9 02 24         L     2,YADDR
  021A C 21 00         STX   1,(2)       ; YADDRのアドレスに結果を格納する
  021B A 22 01         LEA   2,1(2)      ; YADDR++
  021C 9 12 21         ST    2,YADDR
  021D 9 01 1F         L     1,X
  021E A 11 01         LEA   1,1(1)      ; X++
  021F 9 11 1D         ST    1,X
  0220 E 20 F4         B     LOOP
                       ;
  0221 9 01 E1 NEXT:   L     1,M
  0222 9 11 1A         ST    1,X
  0223 9 22 1B         LA    2,YDATA
  0224 9 12 19         ST    2,YADDR     ; YDATAのアドレスを(再び)YADDRに格納す
                       ;
                       ; YDATA[]に格納されている値を合計するループ
  0225 9 01 17 LOOP2:  L     1,X
  0226 9 02 DD         L     2,N
  0227 8 21 00         CMP   1,(2)       ; XとNを比較する
  0228 E 00 0D         BP    FIN         ; XがNより大きい場合にはループを抜ける
  0229 9 02 14         L     2,YADDR
  022A B 22 00         LX    2,(2)       ; 現在のYADDRのアドレスから値を読み出す
  022B 9 01 1D         L     1,SUM
  022C 0 21 00         ADD   1,(2)       ; SUMに加算する
  022D 9 11 1B         ST    1,SUM
  022E 9 02 0F         L     2,YADDR
  022F A 22 01         LEA   2,1(2)      ; YADDR++
  0230 9 12 0D         ST    2,YADDR
  0231 9 01 0B         L     1,X
  0232 A 11 01         LEA   1,1(1)      ; X++
  0233 9 11 09         ST    1,X
  0234 E 20 F1         B     LOOP2
                       ;
  0235 E 33 00 FIN:    HLT               ; プログラム停止
                       ;
  0236 9 02 CA FUNC:   L     2,A         ; f(x)=A*x+B を計算するサブルーチン
                       ; r1にxの値をセットして呼び出す
                       ; r1に計算結果を格納して戻る
  0237 6 21 00         MULT  1,(2)       ; A*xを計算する
  0238 9 03 C9         L     3,B
  0239 0 23 00         ADD   3,(2)       ; A*x+Bの値がr3に格納されている
  023A A 31 00         LEA   1,(3)       ; r1にr3の値をコピーする
  023B E 23 00         RET               ; 呼び出し元に戻る
                       ;
  023C 0000    X:      DS    1           ; 現在のxの値 (作業用)
  023D 0000    YADDR:  DS    1           ; 現在のYDATA[]の位置 (作業用)
  023E 0000    YDATA:  DS    10          ; 各xに対応したf(x)の計算結果を格納
  023F 0000
  0240 0000
  0241 0000
  0242 0000
  0243 0000
  0244 0000
  0245 0000
  0246 0000
  0247 0000
  0248 0000    SUM:    DC    0           ; 計算結果
                       END   

THERE WERE NO ERRORS.

LABEL(S)
A:        0200    B:        0201    M:        0202    N:        0203    
START:    0210    LOOP:     0214    NEXT:     0221    LOOP2:    0225    
FIN:      0235    FUNC:     0236    X:        023C    YADDR:    023D    
YDATA:    023E    SUM:      0248    
