第 21 页 共 25 页
B———————————————————————B
实验B (选做)
一、 实验目的
1 掌握输入输出程序设计的概念和方法。 2 了解PC机外围芯片8255、8259的功能。
3 学习如何在PC机上编写具有输入输出功能的程序,包括8255、8259芯片的使用方法
二、 实验说明
本实验要求自行编写一个键盘输入处理程序,它可以完成键盘字符的读入并进行屏幕显示,本实验要利用IBM—PC系统的硬件结构,分别使用外围芯片8255及8259。
在本例中,利用8255A的A端做数据输入,对应的端口地址为60H;利用B端口作控制端输入,端口地址为61H。8255A的控制端口地址为63H 。
本例的8259中断控制器,其IRQ1端用于键盘中断请求线。键盘通过它可以响CPU发出中断请求。8259的I/O端口地址为21H,可以写入中断屏蔽字,以对8个中断源是否容许中断进行控制。在每次中断结束时,要通过I/O端口地址20H写回一个中断结束命令EOI ,使8259可以清除本次中断。 因此本实验既属于输入输出实验,也属于中断实验。 有关说明将详细地附在参考程序中。
三、 实验内容
利用pc机键盘,编写一个读入并显示键盘输入的演示程序。该程序只接受常规字符(包括回车键及退格键),对特殊功能键不进行处理。在程序中设置这些特殊功能键对应0编号即可,凡是检测到键位编号为0值时,均忽略对它们的处理。有键按下时,送出的扫描码的D7位为0时,当键抬起时,扫描的码D7位为1,以判定键是否被按下。
四、实验准备
1 预习输入输出程序设计的特点和方法。
2 仔细阅读参考程序,弄清外围芯片接口初始化的意义和方法。
五、实验步骤
1 建立源文件,并通过汇编和连接,产生可执行文件。 2 运行程序,观察常规字符键及功能键按下时程序的反应,
六、 实验报告要求
1 给出程序框图,包括主程序框图、中断处理程序框图。 2 说明输入输出程序设计的特点。
3 讨论:将SHIFT键及右SHIFT 键也进行判别处理,它们的扫描码为42及54。为记录SHIFT键的按动状态,可设一个标志单元KBFLAG,右SHIFT按下,KBFLAG的D0位置1,左SHIFT按下,KBFLAG的D1位置1,放下左右的SHIFT键,KBFLAG的相应恢复为0。当程序工作时,应能显示上档键的字符。
七、参考程序清单 ;KEYPRG.ASM
STACK SEGMENT PARA STACK ‘STACK’ DB 256 DUP(0)
STACK ENDS ;设计256个字节堆栈区
Page 21 of 25
第 22 页 共 25 页
DATA SEGMENT PARA PUBLIC ‘DATA’
BUFFER DB 10DUP(0) ;定义10个字节的键盘缓冲区 BUFFER1 DW 0 ;指向键盘缓冲区的起点 BUFFER2 DW 0 ;指向键盘缓冲区的终点 ;注意当BUFFER1=BUFFER2时,表明缓冲区空 ;
SCANTAB DB 0,0,’1234567890- =’,8,0 DB’QWERTYUIOP[]’,0DH,0 DB’ASDFGHJKL;’,0,0,0,0 DB’ZXCVBNM,./’,0,0,0
DB’’,0,0,0,0,0,0,0,0,0,0,0,0 DB 0,0,’789-456+1230.’ DATA ENDS
EXTRN KBINT: FAR ; ;外部引用说明 CODE SEGMENT PARA PUBLIC ‘CODE’ ;主程序段
ASSUME CS:CODE START: MOV AX,DATA MOV DS,AX
ASSUME DS:DATA
;建立自行设计的中断服务程序
CLI ;关中断,以防引起混乱 MOV AX,0 ;确定中断类型号9的物理地址 MOV ES,AX MOV DI,24H
MOV AX,OFFSET KBINT
;写自行设计的中断处理程序入口偏移量到矢量表中 CLD STOSW
MOV AX,CS
STOSW ;再写入中断处理程序段基址
MOV AL,0FCH ;允许定时器和键盘中断的控制字送8259 OUT 21H,AL
STI ;开中断 ;读键盘并显示字符
PROEVEVER:CALL KBGET1 ;读缓冲区字符 PUSH AX
CALL DISPCHAR ;显示接收字符 POP AX
CMP AL,0DH ;是回车符吗? JNZ FOREVER ;不是再接收 CALL DISPCHAR ;是,换行
JMP FOREVER ;接收下一行字符 ;KBGET1取缓冲区字符—>(返回参数) ;KBGET1 PROC NEAR KBGET: PUSH BX
CLI
MOV BX,BUFFER1 MOV BX,BUFFER2
JNZ KBGET2 ;缓冲区不空,转KBGET2 STI ;开中断
Page 22 of 25
第 23 页 共 25 页
POP BX JMP KBGET ; 取缓冲区字符
KBGET2: MOV AL,[BUFFER+BX] ;取缓冲区字符
INC BX ; 首指针加1 CMP BX,10 ;到缓冲区尾吗? JC KBGET3 ; 未到,转,KBGET3 MOV BX,0 ;到,指向缓冲区首 KBGET3: MOV BUFFER1,BX ;保护首指针 STI
POP BX ;恢复BX寄存器 RET KBGET1 ENDP
;DISPCHAR字符显示子程序 DISPCHAR PROC NEAR
PUSH BX
MOV BX,0 ;显示零页 MOV AH,14H ;写功能
INT 10H ;调显示器中断调用 POP BX RET DISPCHAR ENDP CODE ENDS
END START
从FOREVER开始,程序便进入循环,反复读缓冲区字符,并将其显示出来。而键盘缓冲区的内容,是通过键盘中断9的中断处理程序KBINT写入的。KBINT程序如下: ;KBINT键盘中断处理程序
SEG SEGMENT PARA PUBLIC ‘CODE’ ASSUME CS:SEG PUBLIC KBINT KBINT PROC FAR PUSH BX PUSH AX
;读键盘数据,并发确认信号
IN AL,60H ;读8255A 口,即键盘扫描码 PUSH AX
INT AL,61H ;为置确认信号 ;读8255A B口 OR AL,7FH ;置键盘确认信号 OUT 61H,AL ;置PB7位并送键盘 AND AL,7FH ;恢复键盘确认信号 OUT 61H,AL
;将接收的扫描译为ASCII码 POP AX
TEST AL,80H ;检查是否按下? JNZ KBINT2 ;键抬起放弃本次输入 MOV BX,OFFSET SCANTAB
XLAT SCANTAB ;查表找对应ASCII码 CMP AL,0 ;是有效字符键吗? JZ KBINT2 ;不是,放弃 ;存ASCII码字符到缓冲区
Page 23 of 25
第 24 页 共 25 页
MOV BX,BUFFER2 ;取缓冲区尾指针 MOV [BUFFER+BX],AL ;存字符
INC BX ;尾指针加1 CMP BX,10 ;是否到区尾? JC KBINT3 ;不到,转 MOV BX,0 ;到,置新尾址 KBINT3:CMP BX,BUFFER1 ;缓冲区满?
JZ KBINT2 ;不满,存尾指针 MOV BUFFEER2,BX ;结束中断处理
KBINT2:MOV AL,20H ;发EOI ,结束8259中断 OUT 20H,AL POP AX POP BX
IRET ;中断返回 KBINT ENDP SEG ENDS END
;读键盘数据,并发确认信号
IN AL,60H ;读8255A口,即键盘扫描码 PUSH AX
IN AL,61H ;为置确认信号 ;读8255A B口
OR AL ,80H ; 置键盘确认信号 OUT 61H,AL ;置PB7位并送键盘 AND 61H,AL
;将接收的扫描码译为ASII码 POP AX
TEST AL,80H ;检查是否按下
JNZ KBINT2 ;键抬起放弃本次输入 MOV BX,OFFSET SCANTAB
XLAT SCANTAB ;查表找对应ASII码 CMP AL,0 ;是有效字符键吗? JZ KBINT2 ;不是,放弃 ;存ASII码字符到缓冲区
MOV BX,BUFFWR2 ;取缓冲区尾指针 MOV [BUFFER+BX],AL ;存字符
INC BX ;尾指针加1 CMP BX ,10 ;是否到区尾? JC KBINT3 ;不到,转 MOV BX,0 ;到新尾址
KBINT3: CMP BX,BUFFWR1 ;缓冲区满? JZ KBINT2 ;满,转
MOV BUFFWR2 ;不满,存尾指针 ;结束中断处理
KBINT2: MOV AL,20H ;发WOI,结束8259中断 OUT 20H,AL POP AX POP BX
IRET ; 中断返回
Page 24 of 25
第 25 页 共 25 页 KBINT ENDP SEG ENDS END
B———————————————————————B
实验七 综合程序设计
一、预习内容
1. DOS中断,字符输入输出的方法. 2.综合程序设计方法
二、目的要求
1.熟悉DOS中断,掌握字符输入输出的方法.
2.继续熟悉基本程序设计方法,包括循环程序设计,分支程序设计和子程序设计等. 3.练习综合程序设计方法
三、实验内容
数据区存放有10个正数,要求自己编写一个完整的程序实现这10个数的排序,具体要求如下: 1.显示未排序的10个数据;
2.提示输入排序方法,是按从大到小还是从小到大;
3.从键盘输入‘H’或者‘L’决定数据是按从大到小还是从小到大的顺序排列,如果从键盘输入‘H’,则按从大到小顺序排列,如果输入‘L’,则按从小到大顺序排列,否则提示输入错误,请重新输入;
4.显示最后的排序结果。
四、实验报告或作业
1.写出源程序,画出程序流程图;
2.汇编,连接及调试时产生的错误,其原因及解决办法;
3.写出你认为在编写汇编程序中应该注意的地方和你的编程经验; 4.写出你对汇编实验的意见或者建议。
参考书目
1.《IBM-PC 汇编语言程序设计实验教程》沈美明 温冬 张赤红 编著,清华大学出版社 2.《IBM-PC 宏汇编语言程序设计》(第二版),韩宗芬 编著,华中理工大学出版社
3.《IBM PC Assembly Language and Programming》 (Fourth edition),Peter Abel,Prentice-Hall International, Inc.(清华大学影印版)。 4.《Pentium/80486实用汇编语言程序设计》,艾德才等编著,清华大学出版社 《Windows环境下汇编语言程序设计》,蓝琚成、肖金秀编著,地质出版社,2001
Page 25 of 25
相关推荐: