計算機系統(tǒng)第六章:

  1. 系統(tǒng)分解

1.算法三個定義特性:有限性、確定性、可計算性
2.將一個程序分解成獨立的多個小模塊(unit),每個小單元可以獨立實現(xiàn)和運行特性,叫系統(tǒng)分解。

  1. 三種結(jié)構(gòu)

1.三種結(jié)構(gòu)是順序、條件、循環(huán)。

  1. 字符數(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

程序解析:

  1. 寄存器作用:
    R2清零,用于統(tǒng)計相同字符個數(shù)
    R3作為指針,指向字符的地址(LEA)
    R1用來存放R3指向的字符(LDR)
    R0用來存放用戶輸入字符(TRAP X23)
    R4用來確定是否到尾部,字符串尾部為'X00'
  2. 程序:
    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é)果:


image.png
  1. 乘法程序(結(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

程序解析:

  1. LOOP是一個函數(shù)入口,在主程序中JSR調(diào)用,注意要在函數(shù)最后寫RET(這個函數(shù)主要是打印字符串,R1用作指針,string存儲到R0,字符串結(jié)束表示為x0000,然后判斷DSR是否忙碌,然后輸入到DDR)
  2. 輸入的數(shù)字都是字符ASCII,在寄存器里會轉(zhuǎn)換成十六進制(比如你輸入3,實際上是x33,十進制為51)所以要先做減法變成十六進制的個位數(shù),然后顯示字符的時候再加上去。(ASCII .FILL #48 同上面程序的x30相同)
  3. 乘法執(zhí)行部分主要用到循環(huán)結(jié)構(gòu)。2*3就是2加三遍(自加2遍2+2+2)。不過要注意循環(huán)條件,用好調(diào)試debug。
image.png
  1. 求一列數(shù)字和

思路:指針,然后設計一個寄存器做total sum,然后循環(huán)直到遇到x0000
先做一個hex文件,輸入一列數(shù)字

    4000
    000A
    000B
    000C
    000D
    000E
    000F
    0010
    0011
    0012
    0013
    0014

程序解析:

  1. 4000表示起始位置是x4000
  2. 000A到0014表示的是10~20
  3. 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

程序解析:

  1. R6是指向一列數(shù)字(況且稱為數(shù)組吧)的指針,R5存儲指針所指的值,R1是和,計算結(jié)果保存到SAVE內(nèi)存里
  2. 首先要判斷R5是不是0(結(jié)束條件),如果不是則加到R1里,然后R6指向下一位,循環(huán)。
  3. 程序較簡單

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

程序解析:

  1. 任意一個字左移15次等于右移一次,這是核心思想。
  2. 分正數(shù)情況和負數(shù)情況,因為15位為1左移,就變成1位為1了
  3. 最后得到右移一位后的數(shù)字存儲在R0,
  4. 最后用屏蔽碼將15位清0,因為15位是不可能為1的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容