• DOS系统功能调用与BIOS中断调用 [转自KingofCoders]


    DOS系统功能调用与BIOS中断调用

    学习目标:
    1、理解DOS系统功能调用和ROM BIOS中断调用的概念。
    2、熟悉常用的功能调用,如键盘输入字符/字符串、显示器输出字符/字符串等的调用方法。

    一、DOS系统功能调用

    1、什么是DOS系统功能调用

    系统功能调用是DOS为用户提供的常用子程序(80多个),可在汇编语言程序中直接调用。这些子程序的

    主要功能包括:
    (1)设备管理(如键盘、显示器、打印机、磁盘等的管理)
    (2)文件管理和目录操作
    (3)其他管理(如内存、时间、日期等管理)
    这些子程序给用户编程带来很大方便,用户不必了解有关的设备、电路、接口等方面的问题,只需直接调用即可。

    2、调用方法
    DOS功能调用的子程序已按顺序编号——功能号(00H~68H),其调用方法是:
    (1) 功能号→AH
    (2) 入口参数→指定寄存器
    (3) INT 21H
    用户只须给出以上三方面信息,DOS就可根据所给信息自动转入相关子程序执行。

    3、常用的系统功能调用

    (1)键盘输入
    1) 1号调用——从键盘输入单个字符
    调用格式: MOV AH,1
    INT 21H
    功能: 等待从键盘输入一个字符并送入AL。
    执行时系统将扫描键盘,等待有健按下,一旦有健按下,就将其字符的ASCII码读入,先检查是否Ctrl-Break,若是,退出命令执行;否则将ASCII码送AL,同时将该字符送显示器显示。

    2) 10号调用——从键盘输入字符串
    功能: 从键盘接收字符串送入内存的输入缓冲区,同时送显示器显示。
    调用前要求: 先定义一个输入缓冲区
    MAXLEN DB 100 ;第1个字节指出缓冲区能容纳的字符个数,即缓冲区长度,不能为0
    ACLEN DB ? ;第2个字节保留,以存放实际输入的字符个数
    STRING DB 100 DUP(?) ;第3个字节开始存放从键盘输入的字符串。
    调用格式: LEA DX,MAXLEN(缓冲区首偏移地址)
    MOV AH,10
    INT 21H
    注意:调用时,要求DS:DX指向输入缓冲区
    【例】
    DATA SEGMENT
    MAXLEN DB 100
    ACLEN DB ?
    STRING DB 100 DUP(?)
    DATA ENDS
    CODE SEGMENT
    … …
    MOV AX,DATA
    MOV DS,AX
    … …
    LEA DX,MAXLEN
    MOV AH,10
    INT 21H
    … …
    CODE ENDS
    运行程序时,若从键盘输入“YOU ARE SUCESSFUL!”(共计19个字符),则输入缓冲区MAXLEN各单元内容如下图
    740)this.width=740 border=undefined>
    缓冲区MAXLEN各存储单元内容

    (2)显示输出
    1) 2号调用——在显示器上显示输出单个字符
    调用格式: MOV DL,待显示字符的ASCII码
    MOV AH,2
    INT 21H
    功能:将DL中的字符送显示器显示。
    【例】显示输出大写字母A
    MOV DL,41H ;或写为 MOV DL,'A'
    MOV AH,2
    INT 21H

    2) 9号调用——在显示器上显示输出字符串
    调用格式: LEA DX,字符串首偏移地址
    MOV AH,9
    INT 21H
    功能:将当前数据区中DS:DX所指向的以'$'结尾的字符串送显示器显示。
    【例】在显示器上显示字符串“YOU ARE SUCESSFUL!”
    DATA SEGMENT
    STRING DB ' YOU ARE SUCESSFUL! $ '
    DATA ENDS
    CODE SEGMENT
    … …
    MOV AX,DATA
    MOV DS,AX
    LEA DX,STRING
    MOV AH,9
    INT 21H
    … …
    CODE ENDS
    说明:若希望显示字符串后,光标可自动回车换行,可在定义字符串时作如下更改:
    STRING DB ' YOU ARE SUCESSFUL! ' ,0AH,0DH,' $ ' ;在字符串结束前加回车换行的ASCII码0AH,0DH

    [NextPage]

    二、BIOS中断调用

    1、什么是BIOS

    BIOS的全称是ROM-BIOS——ROM Basic I/O System(只读存储器基本输入输出系统)。它是一组固化到微机主板上一个ROM芯片上的子程序,主要功能包括:
    (1)驱动系统中所配置的常用外设(即驱动程序),如显示器、键盘、打印机、磁盘驱动器、通信接口等。
    (2)开机自检,引导装入。
    (3)提供时间、内存容量及设备配置情况等参数。
    使用BIOS中断调用与DOS系统功能调用类似,用户也无须了解相关设备的结构与组成细节,直接调用即可。


    三、综合举例:

    简单的人机对话的实现

    屏幕显示:What’s your name? (使用9号DOS功能调用)
    用户输入:LiPing ↙ (使用10号DOS功能调用)
    屏幕再显示:Hello, LiPing! (使用9号DOS功能调用)

    程序清单:

    DATA SEGMENT
    BUF DB 30
    ACTL DB ?
    STR DB 30 DUP(?)
    MESS DB ‘What’s your name?’,0DH,0AH, ‘$’
    DMESS DB 0DH,0AH, ‘Hello,$’

    DATA ENDS

    CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
    MAIN PROC FAR
    PUSH DS
    MOV AX,0
    PUSH AX
    MOV AX,DATA
    MOV DS,AX
    LEA DX,MESS
    MOV AH,9
    INT 21H ;显示 ‘What’s your name?’
    LEA DX,BUF
    MOV AH,10
    INT 21H ;从键盘接收用户输入的信息
    MOV AL,ACTL ;取得键入字符串的实际长度
    CBW
    MOV SI,AX
    LEA BX,STR
    MOV [BX+SI],BYTE PTR ‘!’ ;在键入的字符串后加‘!’
    MOV [BX+SI+1],BYTE PTR ‘$’ ;在‘!’后加‘$’,以便显示
    LEA DX,DMESS ;显示‘Hello!’
    MOV AH,9
    INT 21H
    LEA DX,STR ;显示键入的字符串
    MOV AH,9
    INT 21H
    RET
    MAIN ENDP

    CODE ENDS
    END MAIN

    740)this.width=740 border=undefined>
    从上图可见,两者相比较,BIOS可更直接地控制外设,故能完成更复杂的输入/输出操作;而DOS操作对硬件依赖性少,比相应的BIOS操作简单,因此在二者能完成同样功能时,应尽量使用DOS功能调用。

    2、调用方法
    用户在汇编语言程序中可使用软中断指令“INT n”调用BIOS程序,其中n是中断类型码。常用的BIOS程序的功能与其中断类型码对应关系如下表:

    中断类型码 BIOS中断调用功能
    10H 显示器I/O中断调用(即显示器驱动程序)
    16H 键盘驱动程序
    17H 打印机驱动程序
    13H 磁盘驱动程序
    14H 通信驱动程序

    例如,用指令“INT 16H”可调用键盘驱动程序。
    当某个BIOS程序中具有多种不同功能时,用不同的编号——功能号加以区分,并约定功能号存放在寄存器AH中。其调用方法与DOS功能调用类似:
    (1) 功能号→AH
    (2) 入口参数→指定寄存器
    (3) 指令“INT n”实现对BIOS子程序的调用
    下面以键盘I/O中断调用为例介绍BIOS中断调用的方法。

    3、键盘I/O中断调用示例
    键盘I/O中断调用(INT 16H)有三个功能,功能号为0~2。
    (1) AH=0
    功能:从键盘读入字符送AL。
    出口参数:(AL)=键入字符的ASCII码;(AH)=键入字符的扫描码
    【例】MOV AH,0
    INT 16H
    调用结果:将键盘输入字符的ASCII码送AL,扫描码送AH。
    (2) AH=1
    功能:从键盘读入字符送AL,并设置ZF标志,若按过任一健,则置ZF=0,否则ZF=1。
    出口参数:ZF=0 ,键盘有输入,(AL)=键入字符的ASCII码;
    ZF=1,键盘无输入
    (3) AH=2
    功能:读取特殊功能建的状态。
    出口参数:AL中是各特殊功能键的状态(如下图)。
    740)this.width=740 border=undefined>
    AL中某位为1,表示对应键按下;为0则表示未按下。

  • 相关阅读:
    Python---Flask--08--Flask-Ckeditor
    Python---Flask--07--SQLAlchemy基本关系
    Python---Flask--06--分页的实现
    Python---Flask--05--g对象和钩子函数
    maven项目管理构建
    POI 设置
    http状态码
    hibernate框架之-查询结果集返回类型
    Struts2框架之-注解开发
    Struts2框架之-Struts2的标签
  • 原文地址:https://www.cnblogs.com/feng801/p/1610372.html
Copyright © 2020-2023  润新知