- 系統(tǒng)分解
1.算法三個定義特性:有限性、確定性、可計算性
2.將一個程序分解成獨立的多個小模塊(unit),每個小單元可以獨立實現(xiàn)和運行特性,叫系統(tǒng)分解。
- 三種結(jié)構(gòu)
1.三種結(jié)構(gòu)是順序、條件、循環(huán)。
- 字符數(shù)統(tǒng)計例子
思路:用一個寄存器當指針指向字符串地址,然后一個寄存器存儲指針所指的值,一個寄存器存儲用戶輸入值,每一次循環(huán),比對指針所指的字符和輸入字符是否一樣,一樣的+1(到另一個寄存器),然后指針+1,然后判斷指針是否是哨兵,如果不是繼續(xù)循環(huán)。
.ORIG X3000
AND R2,R2,#0
LEA R3,STR1
TRAP X23
LOOP1 LDR R1,R3,#0
BRZ LEAVE
NOT R1,R1
ADD R1,R1,#1
ADD R1,R1,R0
BRnp TEMP
ADD R2,R2,#1
TEMP ADD R3,R3,#1
BR LOOP1
LEAVE LD R0,ASCII
ADD R0,R0,R2
TRAP X21
HALT
ASCII .FILL X30
STR1 .STRINGZ "AAAABBBC"
.END
程序解析:
- 寄存器作用:
R2清零,用于統(tǒng)計相同字符個數(shù)
R3作為指針,指向字符的地址(LEA)
R1用來存放R3指向的字符(LDR)
R0用來存放用戶輸入字符(TRAP X23)
R4用來確定是否到尾部,字符串尾部為'X00'- 程序:
1.程序首先判斷R1是否為'x00',如果是的話說明到了尾部(這里用到了條件結(jié)構(gòu)的知識)
2.若不是尾部,則判斷R1是否與R0相同,若相同則R2++,不同則繼續(xù)循環(huán)(循環(huán)結(jié)構(gòu))
3.最后到達尾部,記得把R2的值加上x30(不是#30?。?/strong>).因為寄存器的值使用16進制表達的,如果R2等于4,R2實際上是x04,加上x30之后是x34才表達的是十進制的4.
結(jié)果:

- 乘法程序(結(jié)果在10內(nèi))
1.說明一下為什么結(jié)果要在10以內(nèi),因為我要的是輸出字符ASCII,所以只能表示10以內(nèi)的字符,否則操作難度加大很多。如果是保存在內(nèi)存里的話則表示的范圍會大很多。
2.思路:一個寄存器存儲一個因子A,另一個寄存器存儲因子B,然后A自加B-1次。比如2*3,2自加2次或3自加1次。
.ORIG X3000
BR START
LOOP LDR R0,R1,#0
BRz EXIT
L2 LDI R3,DSR
BRzp L2
STI R0,DDR
ADD R1,R1,#1
BRnzp LOOP
EXIT RET
START LEA R1,str1
JSR LOOP
TRAP X23
ADD R4,R0,#0
LD R1,ASCII
NOT R1,R1
ADD R1,R1,#1
ADD R4,R4,R1
LEA R1,str2
JSR LOOP
TRAP X23
ADD R5,R0,#0
LD R1,ASCII
NOT R1,R1
ADD R1,R1,#1
ADD R5,R5,R1
ADD R6,R4,#0
LOOP2 ADD R5,R5,#-1
BRnz over
ADD R6,R6,R4
BR LOOP2
over LEA R1,str3
JSR LOOP
ADD R0,R6,#0
LD R1,ASCII
ADD R0,R0,R1
TRAP X21
HALT
str1 .STRINGZ "ENTER A NUMBER A: "
str2 .STRINGZ "ENTER A NUMBER B: "
str3 .STRINGZ "A * B = "
ASCII .FILL #48
DSR .FILL XFE04
DDR .FILL XFE06
.END
程序解析:
- LOOP是一個函數(shù)入口,在主程序中JSR調(diào)用,注意要在函數(shù)最后寫RET(這個函數(shù)主要是打印字符串,R1用作指針,string存儲到R0,字符串結(jié)束表示為x0000,然后判斷DSR是否忙碌,然后輸入到DDR)
- 輸入的數(shù)字都是字符ASCII,在寄存器里會轉(zhuǎn)換成十六進制(比如你輸入3,實際上是x33,十進制為51)所以要先做減法變成十六進制的個位數(shù),然后顯示字符的時候再加上去。(ASCII .FILL #48 同上面程序的x30相同)
- 乘法執(zhí)行部分主要用到循環(huán)結(jié)構(gòu)。2*3就是2加三遍(自加2遍2+2+2)。不過要注意循環(huán)條件,用好調(diào)試debug。

- 求一列數(shù)字和
思路:指針,然后設計一個寄存器做total sum,然后循環(huán)直到遇到x0000
先做一個hex文件,輸入一列數(shù)字
4000
000A
000B
000C
000D
000E
000F
0010
0011
0012
0013
0014
程序解析:
- 4000表示起始位置是x4000
- 000A到0014表示的是10~20
- stimulation先加載這個的obj程序,再加載主程序
下面是主程序
.ORIG X3000
AND R1,R1,#0
LD R6,ET
LOOP LDR R5,R6,#0
BRZ EXIT
ADD R1,R5,R1
ADD R6,R6,#1
BR LOOP
EXIT LEA R4,SAVE
STR R1,R4,#0
HALT
ET .FILL X4000
SAVE .BLKW #1
.END
程序解析:
- R6是指向一列數(shù)字(況且稱為數(shù)組吧)的指針,R5存儲指針所指的值,R1是和,計算結(jié)果保存到SAVE內(nèi)存里
- 首先要判斷R5是不是0(結(jié)束條件),如果不是則加到R1里,然后R6指向下一位,循環(huán)。
- 程序較簡單

1.程序結(jié)束后,R1為165(十六進制轉(zhuǎn)為十進制,但是字符是輸不出的,所以說如果保存到內(nèi)存可以表示很大的數(shù),但是輸出則比較難)
2.R6地址為X400B,末尾了

save內(nèi)存存儲了R1的值。
6.求一個字中第一個1
求第一個1的位置,從左往右(0-15),若沒有則R1=-1. 所以R1先設為15,注意循環(huán)中斷條件:碰到1或者R1=-1
.ORIG X3000
AND R1,R1,#0
ADD R1,R1,#15
LEA R2,BIT
LDR R3,R2,#0
LD R4,DET
LOOP AND R5,R4,R3
BRnp OVER
ADD R3,R3,R3
ADD R1,R1,#-1
BRn OVER
BR LOOP
OVER HALT
DET .FILL X8000
BIT .BLKW 1
.END
程序解析:
1.R1初始化為15,從右往左檢測。
2.一個數(shù)自加就是左移
3.與X8000屏蔽碼進行AND計算,R5不為0則Over
4.注意當R1=-1時也要退出loop
字右移
思路:字左移就是自加,比如0000…10 左移15次,就變成000…001了(假如15位后到0位,實際上不是這樣),所以可以用這個思路來實現(xiàn)右移。不過要分兩部分:15位有1和15位為0.
.ORIG X3000
LD R0,NUM
AND R1,R1,#0
ADD R1,R1,#15
LOOP ADD R0,R0,#0
BRN NEG
BRP POS
NEG ADD R0,R0,R0
ADD R0,R0,#1
ADD R1,R1,#-1
BRNZ DONE
BR LOOP
POS ADD R0,R0,R0
ADD R1,R1,#-1
BRNZ DONE
BR LOOP
DONE LD R1,MASK
AND R0,R0,R1
ST R0,NUM
HALT
NUM .FILL X40
MASK .FILL X7FFF
.END
程序解析:
- 任意一個字左移15次等于右移一次,這是核心思想。
- 分正數(shù)情況和負數(shù)情況,因為15位為1左移,就變成1位為1了
- 最后得到右移一位后的數(shù)字存儲在R0,
- 最后用屏蔽碼將15位清0,因為15位是不可能為1的