Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5382081
  • 博文数量: 671
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 7310
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-14 09:56
文章分类

全部博文(671)

文章存档

2011年(1)

2010年(2)

2009年(24)

2008年(271)

2007年(319)

2006年(54)

我的朋友

分类:

2007-03-08 10:03:46

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

一、DOS系统功能调用

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

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

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

2、调用方法
DOS功能调用的子程序已按顺序编号——功能号(00H68H),其调用方法是:
(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
注意:调用时,要求DSDX指向输入缓冲区
【例】
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各单元内容如下图
src=UploadFiles/20041214172529260.gif740)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
功能:将当前数据区中DSDX所指向的'$'结尾的字符串送显示器显示。
【例】在显示器上显示字符串“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! ' 0AH0DH' $ '   ;在字符串结束前加回车换行的ASCII0AH0DH 
      

[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

 

src=UploadFiles/20041214172735684.gif740)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)有三个功能,功能号为02
   (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中是各特殊功能键的状态(如下图)。
  src=UploadFiles/20041214173348749.gif740)this.width=740 border=undefined>
       AL中某位为1,表示对应键按下;为0则表示未按下。

阅读(3021) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-05-12 01:19:43

大哥.摆脱你标点符号用对好不好,搞半天连中文输入和英文输入的符号都不分清楚