您的位置:首页 > 移动开发 > IOS开发

DOS和BIOS功能调用

2008-12-15 16:25 253 查看
 

  MS DOS(disk operation system)是微型计算机磁盘操作系统,操作系统是用来控制和管理计算机的硬件资源,方便用户使用的程序集合。由于这些软件程序存放在硬盘或软盘上,而且主要功能是进行文件管理和输入/输出设备管理,故而称为磁盘操作系统。磁盘操作系统是人和机器交互的界面,用户通过操作系统使用和操作计算机。

随着计算机硬件的发展,DOS版本从DOS 1.0逐步升级到DOS 7.0版本,版本越高功能越强。DOS由三个层次的程序文件及一个BOOT引导程序构成。三个层次模块文件是:

IO.SYS 输入/输出管理系统

MSDOS.SYS 文件管理系统

COMMAND.COM 命令处理系统

  基本输入/输出系统BIOS(basic input/output system)是固化在只读存储器ROM中的基本输入/输出程序。它直接可对外部设备进行设备升级的控制,包括系统测试、初始化引导程序、控制I/O设备的服务程序等。

DOS和BIOS提供了大量的可供用户直接使用的系统服务程序。DOS系统中的IO.SYS(PC DOS IBMBIO.COM)基本输入/输出管理模块通过BIOS控制管理外部设备。DOS与BIOS之间的关系如图4.25所示。



  在一般情况下,用户程序通过MSDOS.SYS使用外部设备。应用汇编语言编程,可以直接使用BIOS中的软中断指令对应的中断调用程序,若对内部硬件比较熟悉,可以用IN和OUT指令对设备进行端口编程。

  一般来说,用户可以用四种方式控制PC的硬件。

  ① 应用高级语言的相应功能语句进行控制。但高级语言中的I/O语句比较少,执行速度慢。

  ② 应用DOS提供的功能程序来控制硬件。可对显示器、键盘、打印机、串行通信等字符设备提供输入/输出服务。DOS提供了近百种I/O功能服务程序,编程者无须对硬件有太深的了解,即可调用。这是一种高层次的调用,使用DOS调用,编程简单,调试方便,可移植性好。

  ③ 应用BIOS提供的功能程序来控制硬件。这是低层次控制,要求编程者对硬件有相当深入的了解。当BIOS与DOS提供的功能相同时,应首先选用DOS。BIOS固化在ROM中,不依赖于DOS操作系统,使用BIOS软中断调用子程序可直接控制系统硬件。BIOS调用速度快,适用于高速运行的场合。中断调用可用软件中断指令“INT n”来实现,n为中断类型码。使用BIOS调用的汇编语言和C语言的程序可移植性比较差。

  ④ 直接使用汇编语言编程进行控制。要求编程者对I/O设备的地址、功能比较熟悉。

     
 

DOS功能调用

MS DOS操作系统为程序设计者提供了可以直接调用的软中断处理程序,每一个中断处理程序完成一个特定的功能操作。依据编程需要选择适当的处理程序,编程者不需再重新编写程序,而是使用INT n软中断指令。每执行一种不同类型码n的软中断指令,就执行一个中断处理程序,其主要功能如下。

① 磁盘的读/写控制。

② 内存管理、文件操作和目录管理。

③ 基本输入/输出(对键盘、打印机和显示器等)控制,另外还有日期、时间管理等。

当类型码n=05H~1FH时,调用BIOS的中断处理程序;类型码n=20H~3FH时,调用DOS的中断处理程序。DOS中断调用方法如图4.26所示。按DOS中断规定,用指令写入口参数,然后执行INT n指令,执行完毕后,依据结果进行分析及处理。



DOS软中断功能及参数见表4.5。其中,入口参数是使用该调用必须具备的条件,如设定寄存器参数等;出口参数是表示软中断程序执行结果放在何处或执行该操作处理的特征。


表4.5 DOS软中断功能及参数
表4.5中 INT 22H,INT 23H,INT 24H不允许用户直接使用。INT 20H的作用是终止正在运行的程序,返回操作系统。这种终止退出程序,适用于扩展名为.COM的文件,而不适用于扩展名为.EXE的可执行文件。INT 27H的作用也是终止正在运行的程序,返回操作系统,但被终止的程序仍然驻留在内存中,不会被其他程序覆盖。

INT 21H软中断是一个具有几十种功能的大型中断服务程序,给这些子功能程序分别予以编号,称为功能号。每个功能程序完成一种特定的操作和处理。对INT 21H软中断指令对应的功能子程序的调用称为DOS系统功能调用。调用系统功能子程序时,不必了解所使用设备的物理特性、接口方式及内存分配等,也不必编写繁琐的控制程序,这样给应用者带来了很大的方便。

应用INT 21H系统功能调用的方法如下。

① 入口参数送指定的寄存器或内存。

② 功能号送AH中。

③ 执行INT 21H软中断指令。

有的子功能程序不需要入口参数,但大部分需要把参数送入指定位置。程序员只要给出这三方面的信息,不必关心程序具体如何执行,在内存中的存放地址如何,DOS就会根据所给的参数信息自动转入相应的子程序去执行并产生相应结果。下面介绍常用的功能调用。

1.键盘输入并显示(1号功能调用)

格式: MOV AH, 01H
INT 21H

功能:按下任何键,将其对应字符的ASCII码送入AL中,并在屏幕上显示该字符。如果按下的是Ctrl+Break组合键,则终止程序执行。1号功能调用无须入口参数,出口参数在AL中。

2.键盘输入但不显示输入字符(8号功能调用)

格式: MOV AH, 08H
INT 21H

功能:同1号功能调用,但字符不在屏幕上显示。

3.屏幕显示一个字符(2号功能调用)

格式: MOV DL, '字符'
MOV AH, 02H
INT 21H

功能:将置入DL寄存器中的字符在屏幕上显示输出。

4.打印输出(5号功能调用)

格式: MOV DL, '字符'
MOV AH, 05H
INT 21H

功能:将置入DL寄存器中的字符送打印机接口,打印输出。

5.屏幕显示字符串(9号功能调用)

格式: MOV DX, 字符串的偏移地址
MOV AH, 09H
INT 21H

功能:在屏幕上显示字符串。

在使用9号功能调用时,应当注意以下问题。

① 待显示的字符串必须先放在内存一数据区(DS段)中,且以‘$’符号作为结束标志。

② 应当将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。

【例4.42】

DATA SEGMENT
BUF DB ‘HOW DO YOU DO?’, 0AH, 0DH, ‘$’



DATA ENDS
CODE SEGMENT



MOV AX, DATA
MOV DS, AX



MOV DX, OFFSET BUF
MOV AH, 09H
INT 21H



CODE ENDS

执行程序,在屏幕上显示“HOW DO YOU DO?”字符串。

6.字符串输入功能调用(0AH号功能调用)

格式: MOV DX, 已定义缓冲区的偏移地址
MOV AH, 0AH
INT 21H

功能:从键盘接收字符,并存放到内存缓冲区。

在使用0AH号功能调用时,应当注意以下问题。

① 执行前先定义一个输入缓冲区,缓冲区内第一个字节定义为允许最多输入的字符个数,字符个数应包括回车符0DH在内,不能为“0”值。第二个字节保留,在执行程序完毕后存入输入的实际字符个数。从第三个字节开始存入从键盘上接收字符的ASCII码。若实际输入的字符个数少于定义的最大字符个数,则缓冲区其他单元自动清0。若实际输入的字符个数大于定义的字符个数,其后输入的字符丢弃不用,且响铃示警,一直到输入回车键为止。整个缓冲区的长度等于最大字符个数再加2。

② 应当将缓冲区首地址的段基址和偏移地址分别存入DS和DX寄存器中。

【例4.43】

DATA SEGMENT
BUF DB 25 ; 缓冲区长度
ACTHAR DB ? ; 保留单元, 存放输入的实际字符个数
CHAR DB 25 DUP (?) ; 定义25个字节存储空间
DB ‘$’



DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
MOV AX, DATA
MOV DS, AX



MOV DX, OFFSET BUF
MOV AH, 0AH
INT 21H



CODE ENDS

本例可从键盘接收23个有效字符并存入以BUF为首地址的缓冲区中。


7.返回DOS操作系统(4CH号功能调用)

格式: MOV AH, 4CH
INT 21H

功能:终止当前程序的运行,并把控制权交给调用的程序,即返回DOS系统,屏幕出现DOS提示符,如“C: / >”,等待DOS命令。

8.直接输入、输出单字符(6号功能调用)

格式: MOV DL, 输入/输出标志
MOV AH, 06H
INT 21H

功能:执行键盘输入操作或屏幕显示输出操作,但不检查Ctrl+Break组合键是否按下。执行这两种操作的选择由DL寄存器中的内容决定。

① 当(DL)=0FFH时,执行键盘输入操作。若标志ZF=0,AL中放入字符的ASCII码;若标志ZF=1,表示无键按下。这种调用用来检测键盘是否有键按下,但不等待键盘输入。

② 当(DL)≠0FFH时,表示将DL中内容送屏幕显示输出。


9.检查键盘的工作状态(0BH号功能调用)

格式: MOV AH, 0BH
INT 21H

功能:检查是否有键盘输入,若有键按下,则使AL=0FFH,若无键按下,则AL=00H。对于利用键盘操作退出循环或使程序结束之类的操作来说,这种调用是很方便实用的。

【例4.44】

LOP: ADD AL, BL



MOV AH, 0BH
INT 21H ; 键扫描: 无输入,AL=00H, 有输入,AL=FFH
ADD AL, 01H
JNZ LOP ; 有输入则退出循环
RET


10.设置系统日期(2BH号功能调用)

格式: MOV CX, 年号
MOV DH, 月号
MOV DL, 日期
MOV AH, 2BH
INT 21H

功能:设置有效的年、月、日。当AL=0时,设置成功;当AL=0FFH时,设置失败。

11.设置系统时间(2DH号功能调用)

格式: MOV CH, 小时
MOV CL, 分
MOV DH, 秒
MOV AH, 2DH
INT 21H

功能:设置有效的时间。当AL=0时,设置成功;当AL=0FFH时,设置失败。

【例4.45】 DOS功能调用子程序举例:回车/换行标准显示输出子程序。

CRLF PROC FAR
PUSH DX
PUSH AX
MOV DL, 0DH ; 回车的ASCII码为0DH
MOV AH, 02H
INT 21H
MOV DL, 0AH ; 换行的ASCII码为0AH
MOV AH, 02H
INT 21H
POP AX
POP DX
RET
CRLF ENDP

BIOS功能调用

  BIOS是固化在只读存储器ROM中的一系列输入/输出服务程序,它存放于内存的高地址区域内,除负责处理系统中的全部内部中断外,还提供对主要I/O接口的控制功能,如键盘、显示器、磁盘、打印、日期与时间等。BIOS采用模块化结构,每个功能模块的入口地址都存于中断向量表中。对这些中断调用是通过软中断指令INT n来实现的,中断指令中的操作数n即为中断类型码。

  BIOS的调用方法与DOS系统功能调用方法类似。

① 置功能号于AH中。

② 置入口参数。

③ 执行INT n。

④ 分析出口参数及状态。

下面介绍几种常用的BIOS中断调用。



1.键盘I/O中断调用(INT 16H)

键盘I/O中断调用有三个功能,功能号为0, 1, 2,且必须把功能号放在AH中。

(1)0号功能调用

格式:MOV AH, 0
INT 16H

  功能:从键盘读入字符送AL寄存器。执行时,等待键盘输入,一旦输入,字符的ASCII码放入AL中。若AL=0,则AH为输入的扩展码。

(2)1号功能调用

格式:MOV AH, 01H
   INT 16H

  功能:用来查询键盘缓冲区,对键盘扫描但不等待,并设置ZF标志。若有按键操作(即键盘缓冲区不空),则ZF=0,AL中存放的是输入的ASCII码,AH中存放输入字符的扩展码。若无键按下,则标志位ZF=1。

(3)2号功能调用

格式: MOV AH, 02H
INT 16H

  功能:检查键盘上各特殊功能键的状态。执行后,各种特殊功能键的状态放入AL寄存器中,其对应关系如图4.27所示。



图4.27 AL寄存器各位与各特殊功能键对应关系示意图


  这个状态字记录在内存0040H:0017H单元中,若对应位为“1”,表示该键状态为“ON”,处于按下状态;若对应位为“0”,表示该键状态为“OFF”,处于断开状态。

【例4.46】

MOV AH, 02H
INT 16H ; 取键盘状态到AL中
AND AL, 0000 0100B ; 检查Ctrl键是否按下
JNZ CTRL-ON



CTRL-ON: …

检查Ctrl键是否按下,若按下,则控制转移到某个程序段执行。



2.打印机I/O中断调用(INT 17H)

打印机I/O中断调用有三个功能,功能号为0, 1, 2。

(1)0号功能调用

  入口参数为AL中放入字符的ASCII码,DX中放打印机号(0~2)。

格式: MOV AL, 'A'
MOV DX, 01H
MOV AH, 0
INT 17H

功能:打印一个字符,且返回打印机状态到AH中。

(2)1号功能调用

格式: MOV AH, 01H
INT 17H

功能:初始化打印机,并返回打印机状态到AH中。

(3)2号功能调用

格式: MOV AH, 02H
INT 17H

功能:返回打印机状态到AH中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: