第一范文网 - 专业文章范例文档资料分享平台

《汇编语言》实验讲义

来源:用户分享 时间:2025/8/21 11:57:10 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

第 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

搜索更多关于: 《汇编语言》实验讲义 的文档
《汇编语言》实验讲义.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c6y4de04p3v47hq610ef4_5.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top