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