DOS系统功能调用及BIOS调用微机原理实验报告.docx
《DOS系统功能调用及BIOS调用微机原理实验报告.docx》由会员分享,可在线阅读,更多相关《DOS系统功能调用及BIOS调用微机原理实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
DOS系统功能调用及BIOS调用微机原理实验报告
西安郵電大學
微型计算机原理
课内实验报告书
院系名称
:
计算机学院
实验题目
:
DOS系统功能调用及BIOS调用
学生姓名
:
专业名称
:
软件工程
班级
:
软件1003班
学号
:
指导教师
:
葛茂
DOS系统功能调用及BIOS调用实验
1实验目的
1、熟悉PC机中断系统的有关概念,了解中断向量表的作用。
2、掌握常用DOS系统功能调用的方法。
3、掌握BIOS中常用设备(如显示器、打印机等)驱动程序的调用方法。
2实验预习要求
1、复习常用DOS系统功能调用方法。
2、复习BIOS调用方法。
3、读懂“2.6.4实验内容”中给出的源程序,以便上机调试。
4、从“2.6.5实验习题”中任选一道题目,编写源程序,以便上机调试。
3中断系统、DOS系统功能调用及BIOS调用简介
微型计算机系统为汇编用户提供了两个程序接口,一个是DOS系统功能调用,另一个是ROM中的BIOS(basicinput/outputsystem)。
系统功能调用和BIOS由一系列的中断服务程序构成,它们使得程序设计人员不必详细了解硬件的内部结构和工作原理,直接调用这些中断服务程序就可以使用系统的硬件,尤其是I/O设备的使用与管理。
如下表所示,IBMPC中断系统为了识别和响应每一种中断,将它们赋以00FFH中断类型号,故中断系统能处理256种中断。
每种类型的中断都对应一个中断服务程序,每个中断服务程序的入口地址包括该程序所在段的段地址和段内偏移地址,需4个存储单元来存放。
将256种中断对应的中断服务程序排成一张表,放在内存底端00000H003FFH单元中,系统在响应中断时根据得到的中断类型号到该表对应的四个存储单元中即可找到要执行的中断服务程序的入口地址。
PC机中断向量表
分类
中断类型号
中断向量所在存储单元地址
功能
分类
中断类型号
中断向量所在存储单元地址
功能
系
统
内
部
中
断
BIOS
00H
000003H
除数为0
设
备
驱
动
BIOS
18H
060063H
ROMBASIC
01H
004007H
单步执行
19H
064067H
系统自举
02H
00800BH
外部非屏蔽中断
1AH
06806BH
日时钟I/O
03H
00C00FH
断点
1BH
06C06FH
键盘中断地址
04H
010013H
溢出
1CH
070073H
定时器报时
05H
014017H
打印屏幕
1DH
074077H
显示器参数
06H
01801BH
保留
1EH
07807BH
软盘参数
07H
01C01FH
保留
1FH
07C07FH
图形字符扩展
8
级
外
部
中
断
BIOS
08H
020023H
日时钟
磁
盘
操
作
系
统
DOS
20H
080083H
DOS程序结束
09H
024027H
键盘
21H
084087H
DOS功能调用
0AH
02802BH
保留
22H
08808BH
程序结束地址
0BH
02C02FH
串口通信2
23H
08C08FH
Ctrl+Break
0CH
030033H
串口通信1
24H
090093H
标准错误出口
0DH
034037H
硬盘
25H
094097H
绝对磁盘读
0EH
03803BH
软盘
26H
09809BH
绝对磁盘写
0FH
03C03FH
打印机
27H
09C09FH
程序结束驻留
282FH
0A00FFH
DOS保留
设
备
驱
动
BIOS
10H
040043H
显示
特
殊
中
断
305FH
10017FH
系统保护
11H
044047H
设备配置
607FH
1801FFH
用户使用
12H
04804BH
存储容量
80F0H
2002C3H
BASIC使用
13H
04C04FH
磁盘I/O
F1FFH
2C43FFH
用户使用
14H
050053H
通信I/O
15H
054057H
录音机I/O
16H
05805BH
键盘I/O
17H
05C05FH
打印机I/O
从功能上分,中断向量表中中断类型可分为三类:
1、磁盘操作系统DOS提供的中断服务程序,中断类型号从20H到2FH。
其中类型号为21H的DOS系统功能调用使用较多,如前面实验中用到的单个字符输入、单个字符显示、字符串显示、字符串输入等操作就是通过调用DOS系统功能(中断类型号为21H,功能号(调用号)分别为01H、02H、09H、0AH)来实现的。
有关DOS系统功能调用(INT21H)中各功能号对应的功能列表见附录A。
2、系统主板BIOS芯片提供的BIOS中断服务程序,包括系统内部中断,中断类型号从00H到07H;系统8级外部中断,中断类型号从08H到0FH;设备驱动程序,中断类型号从10H到1FH等。
3、用户定义的中断,中断类型号从60H到7FH、F1H到FFH。
用户可根据实际需要编写自己的中断服务程序,并将该服务程序的入口地址写入中断向量表中相应的存储单元,以便对它们进行调用。
有关中断服务程序的编写与调用方法将在“2.7中断服务程序设计实验”中介绍。
需要说明的是,许多功能既可以通过DOS系统功能调用实现,也可以通过BIOS调用实现,实际使用时应根据具体情况选择使用,一般原则为:
能通过DOS系统功能调用实现的功能不使用BIOS调用实现。
有关详细介绍请参阅教材“5.5.6常用系统功能调用和BIOS中断调用”一节。
2.6.3实验内容
制作电子时钟,在屏幕上实时显示系统当前时间。
程序运行结果如下图所示。
要求:
屏幕显示方式设置为8025黑白文本方式(使用BIOS中断调用,中断类型号为10H,功能号为00H,(AL)=2);
在开始显示实时时钟和结束之前清屏(使用BIOS中断调用,中断类型号为10H,功能号为06H,(AL)=0);
按任意键退出程序的执行(使用DOS系统功能调用,中断类型号为21H,功能号为0BH,当返回值(AL)=FFH时有键按下,当(AL)=00H时无键按下);
1、编程指导
(1)屏幕显示方式设置宏指令SETCRT
SETCRTMACRO
MOVAH,0;功能号为0
MOVAL,2;将屏幕设置为8025黑白文本方式
INT10H
ENDM
(2)清屏宏指令CLEAR
CLEARMACRO
MOVAH,06H;功能号为6
MOVAL,0;清窗口
INT10H
ENDM
(3)光标位置设置宏指令
CURSORMACROROW,CLM
MOVAH,02H;功能号为2(置光标位置)
MOVBH,00H;页号(文本方式时为0)
MOVDH,ROW;行号送DH
MOVDL,CLM;列号送DL
INT10H
ENDM
(4)按任意键退出程序指令
MOVAH,0BH;功能号为0BH(检测键盘状态)
INT21h
CMPAL,00H;(AL)为0时无键按下
JNZEXITT;有键按下时退出
JMPLOOPR;无键按下时继续循环显示当前时间
EXITT:
……
2、程序框架
DATASEGMENT
BUF1DB"Currenttimeis:
$"
HOURDB20H,20H,':
','$'
MINUTEDB20H,20H,':
','$'
SECONDDB20H,20H,':
','$'
MSECONDDB20H,20H,'$'
INFORDB"Pressanykeytoexit...$"
DATAENDS
STACKSEGMENTSTACK
SNUMDW20HDUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,LENGTHSNUM
定义清屏宏指令CLEAR
定义设置屏幕显示方式宏指令SETCRT
MOVSP,AX
定义将寄存器中存放的二进制数转换为ASCII并存放在内存单元的宏指令TIMER1。
具体代码如下。
定义显示提示信息宏指令STRDSPY
定义设置光标位置宏指令CURSOR
TIMER1MACROREG,ADR
PUSHAX
PUSHBX
LEASI,ADR
MOVAL,REG
MOVAH,00
MOVBL,10
DIVBL
ADDAL,30H
MOV[SI],AL
ADDAH,30H
INCSI
MOV[SI],AH
POPBX
POPAX
ENDM
SETCRT;将屏幕设置为8025黑白文本方
CLEAR;清屏
CURSOR3,22;设置光标位置以便显示BUF1中的提示信息
STRDSPYBUF1
CURSOR7,23;设置光标位置以便显示INFOR中的提示信息
STRDSPYINFOR
LOOPR:
MOVAH,2CH
INT21H;取当前时间。
CH=小时(0-23),CL=分(0-60)
;DH=秒(0-60),DL=1/100秒(0-99),均为二进制形式
PUSHCX
MOVCH,DL
TIMER1CH,MSECOND;将毫秒值转换为ASCII码并存MSECOND单元
MOVCH,DH
TIMER1CH,SECOND;将秒值转换为ASCII码并存MSECOND单元
POPCX
TIMER1CL,MINUTE;将分值转换为ASCII码并存MSECOND单元
TIMER1CH,HOUR;将小时值转换为ASCII码并存MSECOND单元
CURSOR5,24;设置光标位置以便显示当前时间
STRDSPYHOUR
STRDSPYMINUTE
STRDSPYSECOND
STRDSPYMSECOND
MOVAH,0BH;检测是否有键按下
INT21h
CMPAL,00H
JNZEXITT;有键按下则退出
JMPLOOPR;无键按下继续显示当前时间
EXITT:
SETCRT
CLEAR
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2.6.5实验习题
1、编写在屏幕上显示如下信息的程序:
今天是XXXX年XX月XX日星期X
按任意键退出…
提示:
读取日期信息使用DOS系统功能调用功能号为2AH的中断服务程序。
该中断服务程序返回信息如下:
CX=年份(19802099),DH=月份(112),DL=日(031),AL=星期(06,其中0为周日)。
2、编写沿屏幕对角线(从左上角到右下角)显示符号“$”的程序,当显示到右下角时重新从左上角开始显示,直到有键按下时结束程序的执行。
提示:
屏幕设置为8025黑白文本方式;在当前光标处显示字符使用BIOSINT10H(功能号为09H)实现;在当前光标处显示字符后应延时一段时间,然后重新设置屏幕为8025黑白文本方式并清屏(INT10H,功能号为06H,(AL)=0)。
2.6.6实验报告要求
1、补全“2.6.4实验内容”中源程序框架内未写出的程序代码,读懂该程序,并说明你在调试该程序过程中遇到了哪些问题,是如何处理的?
DATASEGMENT
BUF1DB"Currenttimeis:
$"
HOURDB20H,20H,':
','$'
MINUTEDB20H,20H,':
','$'
SECONDDB20H,20H,':
'.'$'
MSECONDDB20H,20H,'$'
INFORDB"Pressanykeytoexit....$"
DATAENDS
STACKSEGMENTSTACK
SNUMDW20HDUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,LENGTHSNUM
MOVSP,AX
SETCRTMACRO
MOVAH,0
MOVAL,2
INT10H
ENDM
CLEARMACRO
MOVAH,06H
MOVAL,0
INT10H
ENDM
CURSORMACROROW,CLM
MOVAH,02H
MOVBH,00H
MOVDH,ROW
MOVDL,CLM
INT10H
ENDM
STRDSPYMACROSTRING
PUSHDX
PUSHAX
MOVDX,OFFSETSTRING
MOVAH,09H
INT21H
POPAX
POPDX
ENDM
TIMER1MACROREG,ADR
PUSHAX
PUSHBX
LEASI,ADR
MOVAL,REG
MOVAH,00
MOVBL,10
DIVBL
ADDAL,30H
MOV[SI],AL
ADDAH,30H
INCSI
MOV[SI],AH
POPBX
POPAX
ENDM
SETCRT
CLEAR
CURSOR3,22
STRDSPYBUF1
CURSOR7,23
STRDSPYINFOR
LOOPR:
MOVAH,2CH
INT21H
PUSHCX
MOVCH,DL
TIMER1CH,MSECOND
MOVCH,DH
TIMER1CH,SECOND
POPCX
TIMER1CL,MINUTE
TIMER1CH,HOUR
CURSOR5,24
STRDSPYHOUR
STRDSPYMINUTE
STRDSPYSECOND
STRDSPYMSECOND
MOVAH,0BH
INT21H
CMPAL,00H
JNZEXITT
JMPLOOPR
EXITT:
SETCRT
CLEAR
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2、从“2.6.5实验习题”中任选一道题目,画出流程图,编写源程序,并说明在调试过程中遇到了哪些问题,是如何处理的。
流程图:
代码:
DATASEGMENT
BUF1DB"Todayis$"
BUF2DB"year$"
BUF3DB"mouth$"
BUF4DB"day$"
BUF5DB"week$"
YEAR1DB20H,20H,'$'
YEAR2DB20H,20H,'$'
MOUTHDB20H,20H,'$'
DAYDB20H,20H,'$'
WEEKDB20H,20H,'$'
INFORDB"Pressanykeytoexit....$"
DATAENDS
STACKSEGMENTSTACK
SNUMDW20HDUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,LENGTHSNUM
MOVSP,AX
SETCRTMACRO
MOVAH,0
MOVAL,2
INT10H
ENDM
CLEARMACRO
MOVAH,06H
MOVAL,0
INT10H
ENDM
CURSORMACROROW,CLM
MOVAH,02H
MOVBH,00H
MOVDH,ROW
MOVDL,CLM
INT10H
ENDM
STRDSPYMACROSTRING
PUSHDX
PUSHAX
MOVDX,OFFSETSTRING
MOVAH,09H
INT21H
POPAX
POPDX
ENDM
TIMER1MACROREG,ADR
PUSHAX
PUSHBX
LEASI,ADR
MOVAL,REG
MOVAH,00
MOVBL,10
DIVBL
ADDAL,30H
MOV[SI],AL
ADDAH,30H
INCSI
MOV[SI],AH
POPBX
POPAX
ENDM
SETCRT
CLEAR
CURSOR7,23
STRDSPYINFOR
LOOPR:
MOVAH,2CH
INT2CH
TIMER1CH,YEAR1
TIMER1CL,YEAR2
TIMER1DH,MOUTH
TIMER1DL,DAY
TIMER1AL,WEEK
CURSOR5,15
MOVDX,OFFSETBUF1
MOVAH,09H
INT21H
STRDSPYYEAR1
STRDSPYYEAR2
MOVDX,OFFSETBUF2
MOVAH,09H
INT21H
STRDSPYMOUTH
MOVDX,OFFSETBUF3
MOVAH,09H
INT21H
STRDSPYDAY
MOVDX,OFFSETBUF4
MOVAH,09H
INT21H
MOVDX,OFFSETBUF5
MOVAH,09H
INT21H
STRDSPYWEEK
MOVAH,0BH
INT21H
CMPAL,00H
JNZEXITT
JMPLOOPR
EXITT:
SETCRT
CLEAR
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
DATASEGMENT
BUF1DB"Todayis$"
BUF2DB"year$"
BUF3DB"mouth$"
BUF4DB"day$"
BUF5DB"week$"
YEAR1DB20H,20H,'$'
YEAR2DB20H,20H,'$'
MOUTHDB20H,20H,'$'
DAYDB20H,20H,'$'
WEEKDB20H,20H,'$'
INFORDB"Pressanykeytoexit....$"
DATAENDS
STACKSEGMENTSTACK
SNUMDW20HDUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,LENGTHSNUM
MOVSP,AX
SETCRTMACRO
MOVAH,0
MOVAL,2
INT10H
ENDM
CLEARMACRO
MOVAH,06H
MOVAL,0
INT10H
ENDM
CURSORMACROROW,CLM
MOVAH,02H
MOVBH,00H
MOVDH,ROW
MOVDL,CLM
INT10H
ENDM
STRDSPYMACROSTRING
PUSHDX
PUSHAX
MOVDX,OFFSETSTRING
MOVAH,09H
INT21H
POPAX
POPDX
ENDM
TIMER1MACROREG,ADR
PUSHAX
PUSHBX
LEASI,ADR
MOVAL,REG
MOVAH,00
MOVBL,10
DIVBL
ADDAL,30H
MOV[SI],AL
ADDAH,30H
INCSI
MOV[SI],AH
POPBX
POPAX
ENDM
SETCRT
CLEAR
CURSOR7,23
STRDSPYINFOR
LOOPR:
MOVAH,2CH
INT2CH
TIMER1CH,YEAR1
TIMER1CL,YEAR2
TIMER1DH,MOUTH
TIMER1DL,DAY
TIMER1AL,WEEK
CURSOR5,15
MOVDX,OFFSETBUF1
MOVAH,09H
INT21H
STRDSPYYEAR1
STRDSPYYEAR2
MOVDX,OFFSETBUF2
MOVAH,09H
INT21H
STRDSPYMOUTH
MOVDX,OFFSETBUF3
MOVAH,09H
INT21H
STRDSPYDAY
MOVDX,OFFSETBUF4
MOVAH,09H
INT21H
MOVDX,OFFSETBUF5
MOVAH,09H
INT21H
STRDSPYWEEK
MOVAH,0BH
INT21H
CMPAL,00H
JNZEXITT
JMPLOOPR
EXITT:
SETCRT
CLEAR
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3、总结
通过这次试验,让我加深了对汇编语言的学习,虽然程序出来的方式是通过照猫画虎的,但还是对汇编有了一定的了解了。