存储器(Memory)是计算机系统中的记忆设备,用来存放程序和数据。有了存储器,计算机才有记忆功能,才能保证正常工作。按存储介质分可分为半导体存储器和磁表面存储器。按存储器的读写功能分可分为只读存储器(ROM)和随机读写存储器(RAM)。
只读存储器ROM是一种对其内容只能读,不能写的存储器。随着半导体技术的发展,只读存储器也根据不同需要设计出不同的种类。其中电可擦除只读存储器(EEPROM)是一种可用电气方法在线擦除和再编程的只读存储器,它既有RAM可读可改写的特性,又有非易失性存储器ROM在掉电后仍能保持所存数据的优点。因此,EEPROM在单片机存储器扩展中可以作程序存储器,也可以用作数据存储器,基于EEPROM存储器的扩展设计有十分重要的意义。
建立一个信息检索系统,每个序号对应一个不同的信息。通过键盘输入不同的指令序号,在电脑屏幕上会输出想要得到的信息。当超出序号范围的时候,屏幕会显示错误。程序还附加一个进一步查询的子程序。在输出信息后,可以对该信息进行查寻,当输入信息与序号相对应的信息完全相同时,会在屏幕上显示NO字样,然后继续进行下一次的提示输入。
存储芯片的扩展包括位扩展、字扩展和字位同时扩展等三种情况。
1、位扩展位扩展是指存储芯片的字(单元)数满足要求而位数不够,需对每个存储单元的位数进行扩展。
例: 用 1K × 4 的 2114 芯片构成 lK × 8 的存储器系统。
分析: 每个芯片的容量为 1K ,满足存储器系统的容量要求。但由于每个芯片只能提供 4 位数据,故需用 2 片这样的芯片,它们分别提供 4 位数据至系统的数据总线,以满足存储器系统的字长要求。
设计要点 :
(1) 将每个芯片的 10 位(1k=2^10)地址线按引脚名称一一并联,按次序逐根接至系统地址总线的低 10 位。
(2) 数据线则按芯片编号连接,1 号芯片的 4 位数据线依次接至系统数据总线的 D0 -D3 , 2 号芯片的 4 位数据线依次接至系统数据总线的 D4 -D7 。
(3) 两个芯片的 端并在一起后接至系统控制总线的存储器写信号(如 CPU 为 8086/8088,也可由 和 /M 或 IO / 组合来承担)
(4) 引脚分别并联后接至地址译码器的输出,而地址译码器的输入则由系统地址总线的高位来承担。 当存储器工作时,系统根据高位地址的译码同时选中两个芯片,而地址码的低位也同时到达每一个芯片,从而选中它们的同一个单元。在读/写信号的作用下,两个芯片的数据同时读出,送上系统数据总线,产生一个字节的输出,或者同时将来自数据总线上的字节数据写入存储器。。
2 、字扩充字扩展用于存储芯片的位数满足要求而字数不够的情况,是对存储单元数量的扩展。
例 : 用 2K × 8 的 2716 A存储器芯片组成 8K × 8 的存储器系统
分析:
由于每个芯片的字长为 8 位,故满足存储器系统的字长要求。但由于每个芯片只能提供 2K 个存储单元,故需用 4 片这样的芯片,以满足存储器系统的容量要求。
设计要点 : 同位扩充方式相似。
(1) 先将每个芯片的 11(2* 2^10) 位地址线按引脚名称一一并联,然后按次序逐根接至系统地址总线的低 11 位。
(2) 将每个芯片的 8 位数据线依次接至系统数据总线的 D0 -D7 。
(3) 两个芯片的 端并在一起后接至系统控制总线的存储器读信号(这样连接的原因同位扩充方式),
(4) 它们的 引脚分别接至地址译码器的不同输出,地址译码器的输入则由系统地址总线的高位来承担。 当存储器工作时,根据高位地址的不同,系统通过译码器分别选中不同的芯片,低位地址码则同时到达每一个芯片,选中它们的相应单元。在读信号的作用下,选中芯片的数据被读出,送上系统数据总线,产生一个字节的输出。
3 、同时进行位扩充与字扩充存储器芯片的字长和容量均不符合存储器系统的要求,需要用多片这样的芯片同时进行位扩充和字扩充,以满足系统的要求。
例 : 用 1K × 4 的 2114 芯片组成 2K × 8 的存储器系统
分析: 由于芯片的字长为 4 位,因此首先需用采用位扩充的方法,用两片芯片组成 1K × 8 的存储器。再采用字扩充的方法来扩充容量,使用两组经过上述位扩充的芯片组来完成。
设计要点 : 每个芯片的 10 根地址信号引脚宜接接至系统地址总线的低 10 位,每组两个芯片的 4 位数据线分别接至系统数据总线的高 / 低四位。地址码的 A 10 、 A 11 经译码后的输出,分别作为两组芯片的片选信号,每个芯片的 控制端直接接到 CPU 的读 / 写控制端上,以实现对存储器的读 / 写控制。
当存储器工作时,根据高位地址的不同,系统通过译码器分别选中不同的芯片组,低位地址码则同时到达每一个芯片组,选中它们的相应单元。在读 / 写信号的作用下,选中芯片组的数据被读出,送上系统数据总线,产生一个字节的输出,或者将来自数据总线上的字节数据写入芯片组。
尝试编写了一个简单程序。为与最后的程序作比较,将此程序列出,如下:
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 ;输入一个数字
INT 21H
CMP AL,‘Q’ ;判断是否输入字符与Q相等,相等跳到EXIT退出
JZ EXIT
CMP AL,‘q’ ;判断是否输入字符与q相等,相等跳到EXIT退出
JZ EXIT
CMP AL,‘0’ ;输入不在0-8范围则退出
JB ERR ;小于0跳转
CMP AL,‘8’
JA ERR ;大于8跳转
SUB AL,30H ;计算字符串的地址
MOV DH,28H ;28H=40
MUL DH
MOV BX,AX ;数据放入BX
CALL DISP
JMP LOP ;输出错误信息后,继续输入序号
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继续输入序号
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 控制循环次数即输出的信息字符个数
LOP1:
MOV DL,[BX] ;循环输出字符串
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 ;源程序结束
调试结果如图所示:
出现的问题有:
问题1:开始输入序号时,只能显示在屏幕的第一个空间。
问题2:在输出没有写满40个字符的字符串时,输出是乱码。
问题3:按Q或q退出时,还会显示一串数字再退出。
程序二在程序一调试的基础上,检查程序发现一些问题,在输入不是Q或q或0至8的数字时,没有写输出显示字符的程序;输入是应该是字符串,因为有回车。在此基础上,继续改善设计的程序,设计出程序二,即最终程序。
输入一个序号,首先判断是否是Q或q。如果是,则直接跳出,结束程序。如果不是,就在已设定好的信息库中检索相应信息,并将信息显示在屏幕上,紧接着跳入下一次序号输入界面。如果没有相应的序号所对应的信息,即超出序号范围会自动报错,并跳到下一次序号输入界面。
主体部分程序如下: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跳转ERROR
JB ERROR
CMP AL,8 ;大于9跳转ERROR JA ERROR
MOV BX,OFFSET MSG0 ;取第一个字符串的首地址 MUL FORTY
ADD BX,AX ;找到相应字符串的地址 CALL DISPLAY ;调用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 ;设置循环次数
DISP1:
MOV DL,[BX] ;输出字符串 MOV AH,2 INT 21H INC BX LOOP DISP1 CALL CRLF JMP BEGIN CALL CRLF
RET ;返回程序
DISPLAY ENDP
调试过程主要由编辑、汇编、链接和执行等几个步骤组成。当编辑好汇编语言源程序后,将其保存为.ASM文件。再调用汇编程序对源程序进行翻译,生成.OBJ的目标文件。在汇编过程中,源程序有错误则不能生成目标文件,经过多次修改最终生成无错误目标文件。之后,调用链接程序(LINK)将用户目标程序和库文件进行链接、定位,生成.EXE可执行文件。如果刚开始可执行程序运行之后没有得到预想的结果,又要重新检查源程序的算法错误,重新编辑、汇编、链接和执行,最终得到预期的结果。
经过多次调试、修改、测试结果,最后基本符合要求。 调试最终结果如图
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)