华 北 电 力 大 学
科 技 学 院
课程名称:微机原理实验指导老师:郭学生姓名:牛玺童班 级:电气学 号:
实 验 报 告
军 11k6 111904010415
实验一 数据转换实验
一、实验目的
(1) 初步掌握在PC机上建立、汇编、链接和运行8086/88汇编语言程序的过程。
(2) 通过对两个验证性试验的阅读、调试、掌握不同进制数及编码相互转换的程序设计方法。
(3) 完成程序设计题,加深对数码转换的理解,了解简单程序设计方法。
二、实验内容
1. 十六进制数转换为ASCII码
设二字节十六进制数存放于其实地址为3500H的内存单元中,把他们转换成ASCII码后,再分别存入起始地址为350A的四个内存单元中。从书上ASCII码表中可知十六进制数加30H即可得到0H~9H的ASCII码,而要得到AH~FH的ASCII码,则需再加7H。
请根据所给流程图理清思路,总结出对应的若干要点。将流程图与参考程序相互。根据分析的结果将运行时内存的变化列写出来。
学习并使用MASM或WAVE仿真软件分析程序运行过程中相关寄存器及相应内存的变化情况来验证自己的猜想,以巩固命令的学习,提高编程能力。
- 1 -
1.1 程序流程图
开始CX? 代码长度DI ? 起始地址DX? 16进制数AX?DX取低四位0~9?N是AH~FH,再增加7HY转换为ASCII码存结果,修改地址指针DX内容右移四次NCX-1=0?Y结束图1-1-1
- 2 -
1.2 实验程序
DATAS SEGMENT
;此处输入数据段代码 DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码 STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
;此处输入代码段代码
MOV CX,0004H;根据转换个数设定循环次数
;(两字节十六进制数如6B2C对应有四个用十六进制表示的ASCII码表示,即四个字节)
MOV DI,3500H;指向该两字节十六进制数起始地址,此时在调试窗口修改内存字节
MOV DX,[DI];将地址3500H中的内容(6B2C)给DX
A1: MOV AX,DX;第一次时DX=6B2C, ;因为想顺序取C、2、6、B,所以需要一个中间变量 AND AX,000FH;取低四位,第一次取到C, CMP AL,0AH;判断AL属于0~9,还是A~F JB A2;如果是0~9,则跳转到A2 ADD AL,07H;若属于A~F,再加上07H后也是再加上30H即得到转换。 A2: ADD AL,30H;0~9的ASCII码对应的十六进制比其 ;本身(注意:亦是十六进制)大30H MOV [DI+0AH],AL;将转码后的C,即43H给350A INC DI;将DI指向下一字节,用于存储转码后的值,第一次自增后要存?2? PUSH CX;功能是接下来要用到CX作为一个中间变量, ;而刚才已经使用并且接下来还会用到CX的值, ;也可以不用CX,用其他不用的寄存器或者直接立即数形式的。 MOV CL,04H;若直接用立即数,可能不稳定,(原因不详)用一个中间变量。
- 3 -
SHR DX,CL;右移四位,如第一次转码后,DX=6B2C, ;为下一次取低四位的2做好前提,将0010b移到低四位 POP CX;执行完后,CX又用于计数
LOOP A1;每一次转码后,执行完此句后,CX的值都要变化, ;分别是3,2,1,0;正好四次。 MOV AH,4CH INT 21H
CODES ENDS
END START
1.3 实验过程与心得 1.3.1 编程要点
1.数据在内存空间中的存储情况要清晰;
图1-1-2
图1-1-3
如上图所示图1-2为处理前的存储情况,通过调试中的内存修改来实现并检查,图1-3为最后期待的转码结果,通过查询内存来检查。
2.基本功能的实现:分两种情况去转码。
中间涉及到比较选择语句,可以通过标志位来理解学习JB的实现条件是由于标志位的变化。 3.取与存两个“指针”的变化
- 4 -
(1)取时通过一个中间变量取经过右移四位后的低字节来依次选择C、2、B、6;使用软件时,看AX经过“AND AX,000FH”后是否取到了这些数。
(2)每一次转码后存储时将指针在存储空间305A不断移动。每次存储后,可查询内存。
(3)每一次循环过后,CX都要变化,也可同时学习PUSH、POP功能。
1.3.2 软件使用简介
1.WAVE软件
它可以将内存的变化及寄存器的变化实时展示出来,红色数据是新变化的值。
查找内存时可通过右键转到地址即可,但需要输入物理地址。如此时偏移地址为3500H,而通过观察DI赋值前一状态ds为20H,则通过计算可知在3700H输入2C,3701H输入6B即可,双击修改。可以与硬件连接做接口实验,但没有人机对话功能。
在使用之前需要建立新项目。过程简介如下:选择8086仿真--右击模块文件--新建项目--假如已编ASM文件(最好一个文件夹中)--保存项目--全部编译--单步执行(F8)--观查内存变化。 2.MASM软件
它可以通过DEBUG调试窗口来进行观察,但需要有不同的命令输入去修改内存,查询内存,并且更新情况也不如WAVE直白,若有其他未考虑的某值变化,不宜观测。单步跟踪(“t”)是先执行上
- 5 -
一条语句,并显示执行后的状态,即显示上一语句执行后的状态。而末尾的命令语句还未执行。
它不需要计算物理地址。如找3500H时,直接输入“d ds:3500”即可查询。另外,标志位的查询尽管每次单步跟踪都显示,但是需要先记住各个符号代表的意思。修改内存较WAVE繁琐,需要输入e 3500,然后会提示修改,但一次只能改一个字节的内容。其余命令可以在左侧DEBUG调试里双击在右侧得到。另外,状态的显示没有记录。
MASM有人机对话功能,但在使用时,无法调试查看内存变化。 过程简介:编程--保存(.asm)--编译成目标文件--生成可执行文件--DEBUG调试。
1.3.3 使用过程
1.将二字节十六进制数存放于起始地址为3500H的内存单元中
图1-1-4
- 6 -
2.查看内存的变化--注意DX的变化
图1-1-5
3. (1)注意AX的变化,已取低四位
(2)标志位的变化:0CH比0AH大,NC表示CF=0,不执行JB
后的命令,即继续执行+07H。
图1-1-6
- 7 -
4. (1)结合图1-7和1-8观察确定内存变化的时刻,了解调试指令t的运行情况; (2)DI的变化
图1-1-7
图1-1-8
- 8 -
5. (1)结合图1-8和图1-9观察DX的变化;
(2)在调试过程中发现AX有非预期的变化,而原先也是有的,只是没注意到。这个对于代码段的思路学习是没太大关系的。
图1-1-9
6. (1)注意CX的变化;
(2)标志位CF由NC变成了CY,判断为JB成立,执行A2
图1-1-10
- 9 -
7. (1)存储顺序的检查,确定指针指在350B,即确定可以往后存储; (2)压栈的变量(CX)变化时间,PUSH后并没有改变CX的值;
图1-1-11
8. (1)出栈的变量(CX)变化,出栈后CX的值还原。(在这里才提到是因为第一次循环中CX都是0004H,看不出变化)
(2)g命令的使用,它可以全部运行,方便查看最后的结果。因为至此关于编程的几个要点已全部明确。
图1-1-12
- 10 -
9. (1)检查执行结果,存储结果与预期相符。
(2)检查CX是否为预期的0,应用跟踪执行指令(‘t’),发现g只是一个断点,用于显示验证。但内存已发生了改变。
图1-1-13
10. 由于内存已变化,无法确定后续命令是否对内存产生效果,虽从内存上不知350C是否再一次得到赋值,但AX的变化也可知。但更改350D的值,观察350D的变化也可以明显确定,形成对比。
图1-1-13
- 11 -
11.通过图1-14和图1-15可知,LOOP指令CX的计数方式。
图1-1-14
图1-1-15
2. 程序设计:将十进制的ASCII码转换为BCD
设从键盘输入的五位十进制数的ASCII码存放在2000H起始的内存单元内。若输入的不是十进制数的ASCII码,则对应存放结果的单元内容为“FF”。完成相应程序的编制,进行调试并验证结果。
- 12 -
2.1 程序流程图
开始转换长度à CX, 2000Hà DI, 3000Hà SIFFà BL(DI)à AL(AL)>3A?YNY(AL)<30?N(AL)-30Hà BL(BL)à (SI)NCX-1=0?Y结束图1-2-1
2.2 程序
DATAS SEGMENT
;此处输入数据段代码 DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码 STACKS ENDS CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
;此处输入代码段代码 MOV CX,05h
MOV BX,2000H;存十进制数的ASCII码的起始位置 GET: MOV AH,01H;键入十进制数 INT 21H ; mov al,31h MOV [BX],AL;比较输入的所对应的ASCII码是否在0~9内 CMP AL,30H JB error CMP AL,39H JA error JMP crec;不经过error
error: ;不是十进制数时,将FFH存入对应内存。 push cx
mov cx,0ffh MOV [BX+1000H],cx pop cx MOV DL,[BX+1000H];直接将FF做为ASCII码所对应的符号显示出来,用以检验 MOV AH,02H INT 21H JMP endd crec: SUB AL,30H;如若属于0~9,则
- 13 -
-30H即可得到对应的十进制数于内存中
MOV[BX+1000H],AL;将每一次翻过来的值放到3000H,3001H...3004H中
MOV DL,[BX+1000H];显示用以检查验证 add dl,30h MOV AH,02H INT 21H endd:
INC BX LOOP GET ;这种显示是一次输入对应两个地方的存储并分别显示。
MOV AH,4CH INT 21H CODES ENDS END START
2.3 程序运行结果
若为0~9,则输入一个数显示一个数;若是除此之外的,则显示FFH做为ASCII所对应的字符,如图2-2所示。另外,这种演示的前提是确定显示语句是正确的。
图2-2
- 14 -
实验二 数据处理实验
一、实验目的
(1) 进一步掌握在PC机上建立、汇编、链接和运行8086/88汇编语言程序的过程。
(2) 通过阅读并调试数据处理的示例程序,完成程序设计题,掌握简单程序的结构。
二、实验内容
1. 寻找最大数和最小数的程序
设在内存缓冲区BUF+1单元开始,存放8个单字节数,其数据长度在BUF单元,要求找出最大数送MAX单元,最小输送MIN单元。假如第一个数是最大数,并送到MAX单元中,依次把余下的数送到MAX单元中,否则取下一个数,最后MAX单元中即为最大数。同理可求出最小数。
1.1 参考程序
DATAS SEGMENT
;此处输入数据段代码
ORG 100H ;定义偏移首地址,方便寻找内存 BUF db 8,22,33,12,-1,-50,-32,97,127 MAX db ? MIN db ? DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS
- 15 -
MOV DS,AX 1.2 实验流程图
;此处输入代码段代码 MOV CH,0
MOV CL,BUF ;存个数数 DEC CX ;后面要循环比较七(8-1)次,先变成七
MOV AL,BUF+1 ;拿出第一个数放到最大数和最小数中,用于比较和更新 MOV MAX,AL ;放到最大数 MOV MIN,AL
MOV BX,OFFSET BUF+2 ;拿第二个数与现有的最大最小值比较 LAST:
MOV AL,[BX] ;AL作为暂时存储的寄存器代表新来的要比较的值 CMP AL,MAX ;判断是否更大 JG GREAT ;若大(用于有符号比较),则跳转
CMP AL,MIN ;判断是否更小,也可将相等的情况视作小于,则可省去,直接跳转至LESS即可
JL LESS ;若小,也相应跳转 JMP NEXT ;若相等,则直接跳过 GREAT:MOV MAX,AL;大数更新 JMP NEXT
LESS:MOV MIN,AL;小数更新
NEXT:INC BX ;BX取的是第二个数(用于排序)的地址,现在要指向下一个,即要判断下一个
LOOP LAST ;第一次循环后,执行此句前cx为7,然后自减,判断是否继续。 ;(第二个数已判断完)
;第七次循环后,执行此句前cx为1,然后自减,cx=0,结束。
;(第八个数已判断完)此时,最大最小值已经放好
MOV AH,4CH INT 21H CODES ENDS
END START
- 16 -
开始BUFàCL, CH清零BUF+1à AL(AL)à MAX(AL)à MINBUF+2地址送BX(BX)à AL(AL)>MAX?YN(AL)
2. 程序设计1
设在内存缓冲区BUF+1单元开始,存放若干个单字节数,其数
据长度在BUF单元,要求在这些数据中查找某个特定数据,若有则把存放在该字符的地址送AX,否则把FF送入AX。完成相应程序的编制,进行调试并验证结果。
2.1 流程图 2.2 程序
开始AX? 查找数BX? AXSI? BUF地址CX? 0CL? [SI]SI? SI+1YBL=[SI]?NCX? CX-1CX=0?N结束YAX? 0FFHAX? SI图 2-2-1
DATAS SEGMENT ;此处输入数据段代码 BUFDB 8,2,33,10110111B,-5,65,30H,45H,20H DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
MOV AX,0;将要查找的数存起来,可以是AX,也可以是其他变量。 MOV BX,AX
MOV SI, OFFSET BUF;取地址 MOV CX,0 ;对整个CX清一下零 MOV CL,[SI];数据个数 A1: INC SI;指向第一个数 CMP BL,[SI];是否是 JE CREC;是的话 JMP ERROR
CREC: MOV AX,SI;将地址给AX JMP END1;完成退出
ERROR:LOOP A1;不是的话,继续比较, ;八次比较后,不再执行,进入下一语句 MOV AX,0FFH
END1: MOV AH,4CH INT 21H CODES ENDS END START
- 17 -
实验三 排序程序设计
一、实验目的
通过阅读并调试示例程序,完成程序设计题,掌握循环程序设计的方法。
二、实验内容 1. 数的排序
在数据块BUF区存放10个无符号数,要求设计程序将这些数由小到大排序,排序后的数仍放在该区域中。
1.1 设计思想
(1) 从最后一个数据(或第一个数)开始,一次把相邻的两个数进行比较,即第N个数和第N-1个数比较,第N-1个数与第N-2个数比较等等;若第二个数大于第N个数则两者交换,否则不交换,直到N个数的相邻两个数都比较完为止。此时,N个数的最小数将被排在N个数的最前列。
(2) 对剩下的N-1个数重复上述步骤,找到N-1个数中的最小数。 (3) 重复第二步,直到N个数全部排好为止。
(4) 本程序的主体思想是冒泡法,通过从后往前每相邻两位的比较将最小数放到最前面,这样循环进行N-1回一定可以将N个数排好序。但为了提高效率,引进另一种方法,如若在某回循环中,每一次相邻两数都是理想顺序,既不需要互换,则可以终止循环。另外,注意有符号数和无符号数的比较命令。
- 18 -
1.2 实验流程图 1.3 实验参考程序
开始设变址值,数组长度CX? 比较次数N交换标志BL =0FFH?YBL? 00H取CjYCj>=Cj-1NCj?àCj-1交换标志BL置为0FFH修改变址值CX=0?NY结束图3-1-1
- 19 -
DATAS SEGMENT
BUF DB 6,23,41,24,-3,-45,12,2,98,43 DATAS ENDS
STACKS SEGMENT
STACKS ENDSCODESSEGMENT ASSUME
CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
mov SI,OFFSET BUF+0AH ;指针指到末尾数据的后一个字
MOV CX,0AH ;设置第一次的比较次数 以及总的循环回数
MOV BL,0FFH ;设定交换标志 A1:
CMP BL,0FFH ;每回向左移动最小数后,检查标志是否有改变,即是否有调整
JNZ A4 ;若某回每两个相比都不存在交换,即该回每次都跳到A3, ;最后返到A1,这时bl还是00,而没被赋为ff,即顺序已排好,则退出
MOV BL,00H ;起始设置,用以比较
DEC CX ;记录回数;如第一次只需要比较9次;
JZ A4 ;最多比较9次就可以把顺序排好,第一次把最小的放在数据首位,
;第二次相当于对9个数排序;直至第九次对两个数排序 PUSH SI
PUSH CX ;保存cx现有的值用以记录回数;每回的比较次数也保留了下来,用以每回的使用 A2:
DEC SI ;用以使每回的第一次指针指到末尾;由于SI需要增加,即指针需要左移,
MOV AL,[SI] ;将高侧(接近尾侧)地址(1回是10)的内容暂时放在AL中 DEC SI ;指向上一个地址 (1回1次时是地址9) CMP AL,[SI] ; (1回1次10和9比较)
JNC A3 ;10若不大于9,则不交换,直接进行该回下一次
XCHG AL,[SI];若10更小,需交换,把9内的值给AL,AL即10内的值放地址9中
MOV [SI+01H],AL ;9的值给10 MOV BL,0FFH ;交换标志 A3:
INC SI;由于SI指到了9,又限于A2开始有dec si,故需要增到需处理位的下一位; ;所以去掉“38”“29”更改“15”的0A-->09亦可 LOOP A2 ;每回的循环次数
POP CX ;此时释放是因为记录回数 POP SI ;从尾端再次开始 JMP A1 ;进行下一回的比较, A4: ;最后跳出结果:一是回数够了能保证顺序调整好,另一个是为了提高效率。
MOV AH,4CH INT 21H CODES ENDS END START
2. 比较相等关系
bufX、bufY和bufZ是3个有符号十六进制数,编写一个比较相等关系的程序:
(1) 如果这三个数都不相等,则显示0; (2) 如果这三个数中有两个数相等,则显示1; (3) 如果这三个数都相等,则显示2;
- 20 -
2.1 程序流程图 2.2 程序
开始DL? 30HDATAS SEGMENT
;此处输入数据段代码 ORG 50h bufX db ? bufY db ? bufZ db ?
show db \ \,\
show1 db \input three keys \,\
show2 db \ the result is \,\DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT
ASSUME
CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
;此处输入代码段代码
;-------------------------------------------- mov ah,09h ;提醒输入 mov dx,offset show1 int 21h
mov ah,09h
mov dx,offset show int 21h
mov ah,01h ;数据采集 int 21h
mov bufX,al
;-------------------------------------------- mov ah,09h
mov dx,offset show ;blank int 21h mov ah,01h int 21h
mov bufY,al
;--------------------------------------------
- 21 -
bufX=bufY?YDL? DL+01HNNbufX=bufZ?YDL? DL+01HDL=32H?Y输出NNbufY=bufZ?YDL? 01H结束图 3-2-1
mov ah,09h
mov dx,offset show ;blank
int 21h mov ah,01h int 21h
mov bufZ,al mov ah,09h
mov dx,offset show2 ;remeber to output int 21h
;-------------------------------------------
MOV DL,30H MOV BL,bufX
MOV CL,bufZ CMP BL,bufY JNE A2 INC DL A2:
CMP BL,CL JNE A3 INC DL
CMP DL,32H JE END1 A3: CMP bufY,CL JNE END1
INC DL END1:
MOV AH,02H INT 21H
MOV AH,4CH INT 21H CODES ENDS END START
2.3 程序结果
1.三个数都不相等时
图3-2-2
2.三个数有两个相等时
图3-2-3
3.三个数都相等时
图3-2-4
- 22 -
实验四 系统中断调用实验
一、实验目的
通过阅读并调试示例程序,完成程序设计题,掌握利用DOS
中断的调用来实现人机对话的编程方法。
二、实验内容 1. 人机会话程序
通过人机会话可以获取程序运行所需要的数据,本程序应用的DOS中断功能,涉及到了1、2、9、0AH四个功能的调用。
1.1 设计思路
首先计算机询问用户姓名,等到用户输入姓名的汉语拼音,然
后将它显示在屏幕上,请用户认可,用户键入“Y”程序结束,否则再次询问用户姓名。
1.2 实验流程图 1.3 实验参考程序
开始屏幕显示询问姓名接收字符串并显示接收字符在AL中N(AL)=Y?Y结束图4-1-1
DATAS SEGMENT
;此处输入数据段代码
MESG1 DB 0DH,0AH,'What is your name? $'
MESG2 DB '? (Y/N) $'
BUF DB 30;大接收字节数 DB ? ;输入的总字节数
DB 30 DUP(?) ;从这开始存要输入的数据 DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码 STACKS ENDS
CODES SEGMENT
- 23 -
ASSUME
CS:CODES,DS:DATAS,SS:STACKS START:
MOV AX,DATAS MOV DS,AX
;此处输入代码段代码 AGAIN: MOV AH,9 MOV DX,OFFSET MESG1 INT 21H MOV AH,0aH MOV DX,OFFSET BUF;WHY NOT +2?这样就指到了这个内存单元 INT 21H MOV BL,BUF+1;WHY+1 ?10号功能的属性:1.首单元存最大接收字节数, ;2.下一单元存输入的总字节数,3.再后面是稍后要存入的数据 MOV BH,0 MOV SI,OFFSET BUF+2 MOV BYTE PTR[BX+SI],'$';用于显示名字(刚才输入的)时作为
结尾结束标识符 MOV AH,2 MOV DL,0AH INT 21H MOV AH,9 MOV DX,OFFSET BUF+2 INT 21H
MOV AH,9 MOV DX,OFFSET MESG2 INT 21H
MOV AH,1 INT 21H CMP AL,'Y' JNZ AGAIN
MOV AH,4CH INT 21H CODES ENDS END START
1.4 程序结果
图4-1-2
2. 程序设计
编写一个源程序,在键盘上按一个键,将从AL返回的ASCII
码显示出来,如果按下ESC键则程序退出。请调用书中的HTOASC子程序。
- 24 -
2.1 程序流程图
开始键入AL<=39H?YAL=‘ESC’?N取高四位AL? AL+30HDL? AL转码显示选择显示功能号取低四位转码显示启动DOS中断显示功能返回结束NAL? AL+07H从主程序来Y图4-2-1
2.2 程序
DATAS SEGMENT
;此处输入数据段代码 DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码 STACKS ENDS
CODES SEGMENT ASSUME
CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS MOV DS,AX
;此处输入代码段代码
MOV AH,01H INT 21H;键入
CMP AL,1BH
JE END1;若是ESC,则退出 ;-----------------------------------
- 25 -
; 假设输入a,则对应的ASCII码为61(ASCII码范围00~7F),
; 而这个61已存在了AL中,分别取其高低各四位然后显示出来即可, ; 即对0~F转换成ASCII码即可,见子程序HTOASC
;-----------------------------------
PUSH AX;取高四位 MOV CL,04H
SHR AL,CL;右移四位才可将高四位当作一个数取到AL中
CALL HTOASC;调用转码显示,也实现了先显示高位 POP AX
PUSH AX;取低四位
AND AL,0FH;与运算取到低位 CALL HTOASC POP AX
END1:
MOV AH,4CH INT 21H
HTOASC PROC CMP AL,39H JBE HTOASC1;ASCII码范围00~7F,只要判断是否比?9?大即可 ADD AL,07H HTOASC1: ADD AL,30H MOV DL,AL;入口参数 MOV AH,02H;单个字符显示 INT 21H;调用DOS中断 RET HTOASC ENDP CODES ENDS END START
2.3 结果
1. 4的ASCII码是34H
图4-2-2
2.输入‘ESC’时
图4-2-3
- 26 -
实验五 存储器扩展及读写实验
一、实验目的
(1) 通过阅读并调试示例程序,完成程序设计题,熟悉静态RAM的扩展方法。
(2) 了解8085/8088与存储器的连接,掌握扩展存储器的读写方法。
二、实验内容
1. 实验原理(62256 RAM介绍)
62556是32K*8的静态存储器,管脚如图5-1所示。其中A0~A14为地址线,DB0~DB7为数据线,/CS为存储器的片选,/OE为存储器数据输出选通信号,/WE为数据写入存储器信号。62256工作方式如表5-1所示。
表5-1 62256工作方式
/CS H L L L /WE X H L H /OE X H H L 方式 未选中 读写禁止 写 读 DB0~DB7 高阻 高阻 IN OUT
3. 实验内容
设计扩展存储器电路的硬件连接图并编制程序,将自负A~Z循环存入62256扩展RAM中,然后再检查扩展存储器中的内容。
- 27 -
4. 硬件设计参考
硬件设计参考电路如图5-2所示。
5. 编程提示
按上述电路接线,62256 RAM只使用了4KB空间,设扩展存储器地址空间范围为0000:8000H~0000:8FFFH。
6.程序
RAMADDR EQU 0000H RAMOFF EQU 8000H
COUNT EQU 1000H;充满2^12个地址(4KB),每个地址放一个字节 ;(一个ASCII码占一个字节)。
CODE SEGMENT ASSUME CS:CODE START:
DPCH PROC NEAR;注意形式 MOV AX,RAMADDR MOV DS,AX;取逻辑地址 MOV BX,RAMOFF;取偏移地址
MOV CX,COUNT;总个数 MOV DL,40H;因为后面需要自增, ;(\\\\)也可将自增改放到LOOP前面,去掉该句
REP1: INC DL
MOV [BX],DL
INC BX;每次存储后,偏移地址自增
CMP DL,5AH
JNZ SS1;若不是'Z',则跳转继续,
MOV DL,40H;等是'Z'时,已将'Z'存入,然后再指向40H ;(\\\\)这种情况下,也是如此。
SS1: LOOP REP1;每一次存储过后都自减,共1000H个 JMP $;结束标志 DPCH ENDP
CODE ENDS
END START
7. 程序设计
7.1 如扩展存储器的地址为0000:9000~0000:9FFFH,地址总线和片选信号如何连接?试设计并画出该电路。
RAMADDR EQU 0000H RAMOFF EQU 9000H COUNT EQU 1000H
- 28 -
CODE SEGMENT ASSUME CS:CODE START:
DPCH PROC NEAR MOV AX,RAMADDR
MOV DS,AX MOV BX,RAMOFF MOV CX,COUNT
MOV DL,40H REP1: INC DL
MOV [BX],DL INC BX
CMP DL,5AH JNZ SS1
MOV DL,40H SS1: LOOP REP1 JMP $ DPCH ENDP
CODE ENDS
END START
7.2编写程序,将4KB扩展存储器交替写入55H和AAH。完成程序的编制,进行调试并验证结果。
RAMADDR EQU 0000H RAMOFF EQU 8000H COUNT EQU 1000H
;也可设为800H,将后面的右移去掉 CODE SEGMENT ASSUME CS:CODE START:
DPCH PROC NEAR
MOV AX,RAMADDR ;段地址
MOV DS,AX
MOV BX,RAMOFF ;偏移地址
MOV CX,COUNT
SHR CX,01H
;由于一次循环存入一个字,故除二 REP1: MOV [BX],55H INC BX MOV [BX],0AAH INC BX
LOOP REP1 JMP $ DPCH ENDP
CODE ENDS
END START
- 29 -