ITEEDU

3.2 几个常用的软件中断

3.2节导航:第一页 第二页 第三页

(1)INT 20H

这个软中断在上一章已经用到了,它的作用就是结束我们的程序并将机器的控制权交给DOS。这个中断由DOS为我们提供,提供这个中断的目的是为了和CP/M-86操作系统兼容。MicroSoft并不提倡使用这个中断来结束程序。DOS为我们提供了更好的方法,这将在后面介绍。

(2)INT 21H

这个软中断也是DOS为我们提供的,它的服务程序包括大量的功能,这些功能都是为方便PC程序员编程而设计的。我们把这个中断称为DOS API(Application Programming Interface),也就是"应用程序编程接口"。如果在所编的程序中需要DOS提供服务,比如打开文件、分配内存等,就需要调用21H中断。下面我们来看几个常用的功能。

功能号:01H
用 途:从键盘接收一个字符并显示在屏幕当前光标位置
参 数:AH=01;AH寄存器中放功能号
调 用:INT 21H;调用21H中断服务程序
返 回:AL=键入字符的ASCII码

凡是调用系统功能编制程序,功能号一律放入AH寄存器。01功能在执行时机器会等待用户按键盘,用户按键后它会把与此键对应的ASCII码由AL寄存器返回给程序。所以如果程序需要其使用者输入一个字符时(例如输入Y/N),可以使用这个功能。

功能号:02H
用 途:在屏幕当前光标位置处显示一个字符
参 数:AH=02H
DL=要显示字符的ASCII码
调 用:INT 21H
返 回:AL=显示字符的ASCII码

这个功能用于把DL中的ASCII字符显示在屏幕上光标所在的位置。此功能返回时会把DL中数据放入AL中,所以如果在调用此功能前AL中存在有用的数据,那么就需要事先保存AL寄存器的内容。请看下面的程序PROG-3。

PROG-3

-a100[Enter] 
09FE:0100 jmp 112        ;跳过字符串数据区
09FE:0102 [Enter]        ;在此处直接打回车
-e102[Enter]             ;用E命令将字符串的ASCII码置入内存 
09FE:0102 FC.50 80.72 74.65 63.73 BA.73 A6.20 
09FE:0108 82.61 04.6e 08.79 83.20 74.6b 5B.65 BA.79 B2.2e
09FE:0110 08.2e 84.2e 74.[Enter]
-a112[Enter]
09FE:0112 mov bx,102        ;BX寄存器中置入字符串数据区首址
09FE:0115 mov cx,10 ;需要处理的字符个数置入CX寄存器
09FE:0118 mov dl,[bx] ;取得一个字符的ASCII码到DL寄存器
09FE:011A mov ah,02 ;选择DOS API的02H功能
09FE:011C int 21 ;调用21H中断显示DL中的字符
09FE:011E inc bx ;BX寄存器加1指向下一个字符
09FE:011F loop 118 ;返回0118H处继续处理BX所指向的新字符
09FE:0121 mov ah,01 ;选择DOS API的01H功能
09FE:0123 int 21 ;调用21H中断等待键盘输入
09FE:0125 mov bl,al ;保存键盘输入字符的ASCII码
09FE:0127 mov dl,0d ;DL寄存器置入回车符的ASCII码0DH
09FE:0129 mov ah,02 ;选择DOS API的02H功能
09FE:012B int 21 ;调用21H中断显示回车符
09FE:012D mov dl,0a ;DL寄存器置入换行符的ASCII码0AH
09FE:012F int 21 ;调用21H中断显示换行符
09FE:0131 mov dl,bl ;DL寄存器置入刚刚输入的字符
09FE:0133 int 21 ;调用21H中断显示刚刚输入的字符
09FE:0135 int 20 ;调用20H中断结束程序,返回DOS
09FE:0137 [Enter]

程序例PROG-3给出了这两个功能调用的应用实例。注意每行指令的后面都有一个带“;”的说明性文字,这些文字的作用是使程序比较易懂,大家在上机输入程序时不能输入这些文字。

   程序中出现了一条新的指令──INC:

助记符:INC(Increase)
用 途:将寄存器或存储器中的数据加1
格 式:INC 寄存器
INC 存储单元
执 行:相应寄存器或存储器中的数据加了1

此指令的功能和前面所讨论的DEC正相反,需要对照记忆。

这个程序可以把内存中的一串文字显示在屏幕上,这个程序应用了一些新的技术:
① 我们使用了DEBUG的"E"(EDIT)命令将文字串放入内存;
② 程序中使用了"间接寻址"技术。

"E"(EDIT)命令具有"编辑内存"的功能,它的用法很简单,在提示符后键入"E段:偏移[Enter]"即可。DEBUG会把指定内存单元的内容显示在屏幕上,同时等待输入新数据,如果只修改一字节内容,则在输入数据后打回车;若要修改相临的下一字节内容,则在输入数据后打空格,待把所有数据修改完后再打回车结束此命令。注意如果只输入偏移地址,则DEBUG会默认DS为段地址。