存儲器(Memory)是計算機(jī)系統(tǒng)中的記憶設(shè)備,用來存放程序和數(shù)據(jù)。有了存儲器,計算機(jī)才有記憶功能,才能保證正常工作。按存儲介質(zhì)分可分為半導(dǎo)體存儲器和磁表面存儲器。按存儲器的讀寫功能分可分為只讀存儲器(ROM)和隨機(jī)讀寫存儲器(RAM)。
只讀存儲器ROM是一種對其內(nèi)容只能讀,不能寫的存儲器。隨著半導(dǎo)體技術(shù)的發(fā)展,只讀存儲器也根據(jù)不同需要設(shè)計出不同的種類。其中電可擦除只讀存儲器(EEPROM)是一種可用電氣方法在線擦除和再編程的只讀存儲器,它既有RAM可讀可改寫的特性,又有非易失性存儲器ROM在掉電后仍能保持所存數(shù)據(jù)的優(yōu)點。因此,EEPROM在單片機(jī)存儲器擴(kuò)展中可以作程序存儲器,也可以用作數(shù)據(jù)存儲器,基于EEPROM存儲器的擴(kuò)展設(shè)計有十分重要的意義。
建立一個信息檢索系統(tǒng),每個序號對應(yīng)一個不同的信息。通過鍵盤輸入不同的指令序號,在電腦屏幕上會輸出想要得到的信息。當(dāng)超出序號范圍的時候,屏幕會顯示錯誤。程序還附加一個進(jìn)一步查詢的子程序。在輸出信息后,可以對該信息進(jìn)行查尋,當(dāng)輸入信息與序號相對應(yīng)的信息完全相同時,會在屏幕上顯示NO字樣,然后繼續(xù)進(jìn)行下一次的提示輸入。
存儲芯片的擴(kuò)展包括位擴(kuò)展、字?jǐn)U展和字位同時擴(kuò)展等三種情況。
1、位擴(kuò)展
位擴(kuò)展是指存儲芯片的字(單元)數(shù)滿足要求而位數(shù)不夠,需對每個存儲單元的位數(shù)進(jìn)行擴(kuò)展。
例: 用 1K × 4 的 2114 芯片構(gòu)成 lK × 8 的存儲器系統(tǒng)。
分析: 每個芯片的容量為 1K ,滿足存儲器系統(tǒng)的容量要求。但由于每個芯片只能提供 4 位數(shù)據(jù),故需用 2 片這樣的芯片,它們分別提供 4 位數(shù)據(jù)至系統(tǒng)的數(shù)據(jù)總線,以滿足存儲器系統(tǒng)的字長要求。
設(shè)計要點 :
?。?) 將每個芯片的 10 位(1k=2^10)地址線按引腳名稱一一并聯(lián),按次序逐根接至系統(tǒng)地址總線的低 10 位。
(2) 數(shù)據(jù)線則按芯片編號連接,1 號芯片的 4 位數(shù)據(jù)線依次接至系統(tǒng)數(shù)據(jù)總線的 D0 -D3 , 2 號芯片的 4 位數(shù)據(jù)線依次接至系統(tǒng)數(shù)據(jù)總線的 D4 -D7 。
?。?) 兩個芯片的 端并在一起后接至系統(tǒng)控制總線的存儲器寫信號(如 CPU 為 8086/8088,也可由 和 /M 或 IO / 組合來承擔(dān))
?。?) 引腳分別并聯(lián)后接至地址譯碼器的輸出,而地址譯碼器的輸入則由系統(tǒng)地址總線的高位來承擔(dān)。 當(dāng)存儲器工作時,系統(tǒng)根據(jù)高位地址的譯碼同時選中兩個芯片,而地址碼的低位也同時到達(dá)每一個芯片,從而選中它們的同一個單元。在讀/寫信號的作用下,兩個芯片的數(shù)據(jù)同時讀出,送上系統(tǒng)數(shù)據(jù)總線,產(chǎn)生一個字節(jié)的輸出,或者同時將來自數(shù)據(jù)總線上的字節(jié)數(shù)據(jù)寫入存儲器。。
2 、字?jǐn)U充
字?jǐn)U展用于存儲芯片的位數(shù)滿足要求而字?jǐn)?shù)不夠的情況,是對存儲單元數(shù)量的擴(kuò)展。
例 : 用 2K × 8 的 2716 A存儲器芯片組成 8K × 8 的存儲器系統(tǒng)
分析:
由于每個芯片的字長為 8 位,故滿足存儲器系統(tǒng)的字長要求。但由于每個芯片只能提供 2K 個存儲單元,故需用 4 片這樣的芯片,以滿足存儲器系統(tǒng)的容量要求。
設(shè)計要點 : 同位擴(kuò)充方式相似。
?。?) 先將每個芯片的 11(2* 2^10) 位地址線按引腳名稱一一并聯(lián),然后按次序逐根接至系統(tǒng)地址總線的低 11 位。
(2) 將每個芯片的 8 位數(shù)據(jù)線依次接至系統(tǒng)數(shù)據(jù)總線的 D0 -D7 。
(3) 兩個芯片的 端并在一起后接至系統(tǒng)控制總線的存儲器讀信號(這樣連接的原因同位擴(kuò)充方式),
(4) 它們的 引腳分別接至地址譯碼器的不同輸出,地址譯碼器的輸入則由系統(tǒng)地址總線的高位來承擔(dān)。 當(dāng)存儲器工作時,根據(jù)高位地址的不同,系統(tǒng)通過譯碼器分別選中不同的芯片,低位地址碼則同時到達(dá)每一個芯片,選中它們的相應(yīng)單元。在讀信號的作用下,選中芯片的數(shù)據(jù)被讀出,送上系統(tǒng)數(shù)據(jù)總線,產(chǎn)生一個字節(jié)的輸出。
3 、同時進(jìn)行位擴(kuò)充與字?jǐn)U充
存儲器芯片的字長和容量均不符合存儲器系統(tǒng)的要求,需要用多片這樣的芯片同時進(jìn)行位擴(kuò)充和字?jǐn)U充,以滿足系統(tǒng)的要求。
例 : 用 1K × 4 的 2114 芯片組成 2K × 8 的存儲器系統(tǒng)
分析: 由于芯片的字長為 4 位,因此首先需用采用位擴(kuò)充的方法,用兩片芯片組成 1K × 8 的存儲器。再采用字?jǐn)U充的方法來擴(kuò)充容量,使用兩組經(jīng)過上述位擴(kuò)充的芯片組來完成。
設(shè)計要點 : 每個芯片的 10 根地址信號引腳宜接接至系統(tǒng)地址總線的低 10 位,每組兩個芯片的 4 位數(shù)據(jù)線分別接至系統(tǒng)數(shù)據(jù)總線的高 / 低四位。地址碼的 A 10 、 A 11 經(jīng)譯碼后的輸出,分別作為兩組芯片的片選信號,每個芯片的 控制端直接接到 CPU 的讀 / 寫控制端上,以實現(xiàn)對存儲器的讀 / 寫控制。
當(dāng)存儲器工作時,根據(jù)高位地址的不同,系統(tǒng)通過譯碼器分別選中不同的芯片組,低位地址碼則同時到達(dá)每一個芯片組,選中它們的相應(yīng)單元。在讀 / 寫信號的作用下,選中芯片組的數(shù)據(jù)被讀出,送上系統(tǒng)數(shù)據(jù)總線,產(chǎn)生一個字節(jié)的輸出,或者將來自數(shù)據(jù)總線上的字節(jié)數(shù)據(jù)寫入芯片組。
嘗試編寫了一個簡單程序。為與最后的程序作比較,將此程序列出,如下:
DATA SEGMENT
n0 db ‘0000000000000000000000000000000000000000’
n1 db‘1111111111111111111111111111111111111111’
n2 db ‘2222222222222222222222222222222222222222’
n3 db ‘3333333333333333333333333333333333333333’
n4 db ‘4444444444444444444444444444444444444444’
n5 db ‘5555555555555555555555555555555555555555’
n6 db‘6666666666666666666666666666666666666666’
n7 db ‘777’
n8 db ‘888’
Errmsg DB ‘No! Input 0-8! Q or q , Exit $’ ;輸出錯誤信息 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA ;段屬性說明
START:
MOV AX,DATA ;初始化DS
MOV DS,AX LOP:
MOV AH,01H ;輸入一個數(shù)字
INT 21H
CMP AL,‘Q’ ;判斷是否輸入字符與Q相等,相等跳到EXIT退出
JZ EXIT
CMP AL,‘q’ ;判斷是否輸入字符與q相等,相等跳到EXIT退出
JZ EXIT
CMP AL,‘0’ ;輸入不在0-8范圍則退出
JB ERR ;小于0跳轉(zhuǎn)
CMP AL,‘8’
JA ERR ;大于8跳轉(zhuǎn)
SUB AL,30H ;計算字符串的地址
MOV DH,28H ;28H=40
MUL DH
MOV BX,AX ;數(shù)據(jù)放入BX
CALL DISP
JMP LOP ;輸出錯誤信息后,繼續(xù)輸入序號
ERR:
MOV DL,0DH ;輸出提示錯誤語句
MOV AH,02
INT 21H
MOV DX,OFFSET Errmsg
MOV AH,9
INT 21H
MOV DL,0DH ;回車和換行
MOV AH,02
INT 21H
JMP LOP ;返回LOP繼續(xù)輸入序號
EXIT:
MOV AH,4CH ;返回DOS
INT 21
DISP PROC NEAR
MOV DL,0DH ;回車換行
MOV AH,02
INT 21H
MOV DL,0AH ;多字符輸入
MOV AH,02
INT 21H
MOV CX,28H ;28H=40 控制循環(huán)次數(shù)即輸出的信息字符個數(shù)
LOP1:
MOV DL,[BX] ;循環(huán)輸出字符串
MOV AH,02H
INT 21H
INC BX ;BX打印字符
LOOP LOP1
MOV DL,0DH
MOV AH,02
INT 21H
MOV DL,0AH
MOV AH,02
INT 21H
RET
DISP ENDP
CODE ENDS
END START ;源程序結(jié)束
調(diào)試結(jié)果如圖所示:
出現(xiàn)的問題有:
問題1:開始輸入序號時,只能顯示在屏幕的第一個空間。
問題2:在輸出沒有寫滿40個字符的字符串時,輸出是亂碼。
問題3:按Q或q退出時,還會顯示一串?dāng)?shù)字再退出。
程序二
在程序一調(diào)試的基礎(chǔ)上,檢查程序發(fā)現(xiàn)一些問題,在輸入不是Q或q或0至8的數(shù)字時,沒有寫輸出顯示字符的程序;輸入是應(yīng)該是字符串,因為有回車。在此基礎(chǔ)上,繼續(xù)改善設(shè)計的程序,設(shè)計出程序二,即最終程序。
輸入一個序號,首先判斷是否是Q或q。如果是,則直接跳出,結(jié)束程序。如果不是,就在已設(shè)定好的信息庫中檢索相應(yīng)信息,并將信息顯示在屏幕上,緊接著跳入下一次序號輸入界面。如果沒有相應(yīng)的序號所對應(yīng)的信息,即超出序號范圍會自動報錯,并跳到下一次序號輸入界面。
主體部分程序如下:
BEGIN:
CALL CRLF ;回車換行
LEA DX,MSG ;輸出提示語句Please input a number: MOV AH,09H INT 21H
MOV AH,1 ;輸入序號 INT 21H
CMP AL,‘Q’ ;判斷為?Q?退出 JE EXIT
CMP AL,‘q’ ;判斷為?q?退出 JE EXIT
SUB AL,‘0’ ;小于0跳轉(zhuǎn)ERROR
JB ERROR
CMP AL,8 ;大于9跳轉(zhuǎn)ERROR JA ERROR
MOV BX,OFFSET MSG0 ;取第一個字符串的首地址 MUL FORTY
ADD BX,AX ;找到相應(yīng)字符串的地址 CALL DISPLAY ;調(diào)用DISPLAY子程序
定義ERROR程序:提示錯誤,重新要求輸入序號,再次檢測。
ERROR:
CALL CRLF ;回車換行
LEA DX,ERRMSG ;提示錯誤語句 MOV AH,09H INT 21H CALL CRLF
JMP BEGIN ;返回BEGIN程序
定義顯示信息程序:將字符信息一個個輸出。
DISPLAY PROC NEAR CALL CRLF
LEA DX,MSG9 ;提示語The message is: MOV AH,09H INT 21H
MOV CX,40 ;設(shè)置循環(huán)次數(shù)
DISP1:
MOV DL,[BX] ;輸出字符串 MOV AH,2 INT 21H INC BX LOOP DISP1 CALL CRLF JMP BEGIN CALL CRLF
RET ;返回程序
DISPLAY ENDP
調(diào)試過程主要由編輯、匯編、鏈接和執(zhí)行等幾個步驟組成。當(dāng)編輯好匯編語言源程序后,將其保存為.ASM文件。再調(diào)用匯編程序?qū)υ闯绦蜻M(jìn)行翻譯,生成.OBJ的目標(biāo)文件。在匯編過程中,源程序有錯誤則不能生成目標(biāo)文件,經(jīng)過多次修改最終生成無錯誤目標(biāo)文件。之后,調(diào)用鏈接程序(LINK)將用戶目標(biāo)程序和庫文件進(jìn)行鏈接、定位,生成.EXE可執(zhí)行文件。如果剛開始可執(zhí)行程序運(yùn)行之后沒有得到預(yù)想的結(jié)果,又要重新檢查源程序的算法錯誤,重新編輯、匯編、鏈接和執(zhí)行,最終得到預(yù)期的結(jié)果。
經(jīng)過多次調(diào)試、修改、測試結(jié)果,最后基本符合要求。 調(diào)試最終結(jié)果如圖
評論