🍻 国庆节快乐!
文章目录
- 一、功能调用简介
- 二、DOS常用功能调用
- 1、功能号 01H (调用指令INT 21H)
- 2、功能号 02H (调用指令INT 21H)
- 3、功能号 09H (调用指令INT 21H)
- 4、功能号 0AH (调用指令INT 21H)
- 5、功能号 4CH (调用指令INT 21H)
- 三、BIOS常用功能调用
- 1、功能号 00H (调用指令INT 16H)
- 2、功能号 0EH (调用指令INT 16H)
- 四、参考附录:
一、功能调用简介
● 在汇编里面要使用一些已经写好的子程序的话,我们就可以使用功能调用。且有两种方式:
① 通过操作系统内核里面提供的一些子程序。(也叫做 DOS 功能调用)。
② 绕开操作系统,直接调用主板芯片上固化的子程序。(叫做 BIOS 功能调用)
■ DOS/BIOS 调用模式:
DOS/BIOS 调用模式:
MOV AH, 功能号
设置入口参数
INT n
分析出口参数
♦ 说明:
① 其中 n 值因子程序的不同而可能不同,比如:ROM BIOS 有 n = 5 ~ 1FH,而DOS 有 n = 20H、21H、23 ~ 2AH、2EH、2FH、33H 和 67H 等几种情况。有的 n 只对应一个子程序,有的 n 对应很多子程序。
② 子程序调用结束后一般都有出口参数,这些出口参数常放在寄存器中,通过出口参数可以知道功能调用的成功与否。
③ 在 DOS 功能子程序调用中,我们把通过 “INT 21H” 来实现的子程序调用称为 DOS 系统功能调用。
二、DOS常用功能调用
● DOS 功能调用的例子如下:【简单了解即可】
♦ 说明:
① 中断向量表在下学期会学,它是一种数据结构。它储存了我们要调用的子程序的真实地址。
② “绿色” 部分放大即是我们的右边的 “用户程序”。当在 “右边” 执行到代码段的 “INT 21H” 后,系统会自动做计算 (根据 n =21H ,然后去中断向量表去找) 来找出子程序。
③ 它执行完后还要回到原来的 “中断点”,但它不像以前讲的 CALL 命令。
1、功能号 01H (调用指令INT 21H)
■ 入口参数:无。
■ 出口参数:AL = 按键的 ASCII 码。注:若 AL = 0,表明按键是功能键、光标键,需再次调用此功能,才能返回按键的扩展码。
▶ 功能:等待键入一个字符,有回显,并用 “Ctrl + C” 结束输入。【回显:当敲某个键时,屏幕上会对应出现该字符】
举例:
MOV AH, 1
INT 21H
● 补充:“07H”——无回显+不响应Ctrl_c;“08H” 无回显+响应Ctrl_c。
2、功能号 02H (调用指令INT 21H)
■ 入口参数:DL = 待显字符的 ASCII 码。
■ 出口参数:无。
▶ 功能:显示一个字符。响应组合键为 “Ctrl+C”。本功能在屏幕的当前位置显示一个字符,光标右移一格,如果是在一行末尾显示字符,则光标返回下一行的开始格。如果是在屏幕的右下角显示字符,则光标在返回时屏幕要上滚一行。【注意:该项功能会破坏AL寄存器的内容】
" 举例一: 在文本屏幕上显示字符 A "
MOV DL, 'A'
MOV AH, 2
INT 21H
" 举例二: 从键盘键入一个“Q”, 屏幕上回显一个“Q” "
.586
DATA SEGMENT USE16
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG: MOV AX,DATA
MOV DS,AX
MOV AH,1 ; 从键盘上获取一个字符(功能号 01H)
INT 21H
MOV DL,AL
MOV AH,2 ; 显示(功能号 02H)
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
● 样例二的运行结果:
♦ 说明:要先 “Compile”,再 “Link”,最后才能 “Run”。
" 举例三:【两数相加】从键盘键入一个 1 位的加数,一个 1 位的被加数, 并将它们的和显示在屏幕上"
.586
DATA SEGMENT USE16
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE, DS:DATA
BEG: MOV AX, DATA
MOV DS, AX
MOV AH, 1
INT 21H ; 键入3,(AL)=33H
SUB AL, 30H ;(AL)=3
MOV DL, AL ;(DL)=3
MOV AH, 1
INT 21H ; 键入4,(AL)=34H
SUB AL, 30H ;(AL)=4
ADD DL, AL ; 相加:(DL)=7
ADD DL, 30H ;(DL)=37H
MOV AH, 2 ; 回显
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
● 样例三的运行结果:
♦ 说明:键入的数字 “3” 是 ASCII 码(值为51),所以我们要减去 “30H(转化为十进制即是48)”。
3、功能号 09H (调用指令INT 21H)
■ 入口参数:DS:DX = 字符串首地址,字符串必须以 ‘$’ (即 ASCII 码 24H ) 为结束标志。
■ 出口参数:无。
▶ 功能:该项功能从屏幕当前位置开始,显示字符串,遇到结束标志 ‘$’ 时停止,但这个字符并不显示。【注意:9号功能也会破坏 AL 寄存器的内容】
" 例: 在屏幕上显示‘HELLO WORLD!’ "
.586
DATA SEGMENT USE16 ; 定义数据段
MESG DB 'HELLO WORLD!', '$'
DATA ENDS
CODE SEGMENT USE16 ; 定义代码段
ASSUME CS:CODE, DS:DATA
BEG: MOV AX, DATA
MOV DS, AX
LAST: MOV AH, 9
MOV DX, OFFSET MESG ; 把 MESG 的首地址给 DX 寄存器
INT 21H
MOV AH, 4CH
INT 21H ; 返回DOS
CODE ENDS
END BEG
● 运行结果:
♦ 说明:“ MESG DB ‘HELLO WORLD!’, ‘$’ ” 写成 “ MESG DB ‘HELLO WORLD!$’
4、功能号 0AH (调用指令INT 21H)
■ 入口参数:DS:DX 指向放键入字符的缓冲区。
■ 出口参数:存放于缓冲区的字符串,以回车键结尾。
▶ 功能:等待键入一串字符,送用户程序数据缓冲区。【注意:缓冲区中的第一个字节由用户写入,其余字节由系统写入;如果输入的字节数少于定义的字节数,缓冲区其余字节将自动补零;输入的字节数大于定义的字节数,后来输入的字符被自动被丢弃且响铃警告。】
● 例:使用 0AH号 DOS 功能调用, 从键盘获取最大长度为 100 的字符串(包含回车键):
● 示意图:
♦ 说明:“41H” 是 “A” 的十六进制的 ASCII 码。“0DH” 是回车符(CR,十进制的 ASCII 码为13)。
● 代码如下:
.586
DATA SEGMENT USE16 ; 定义数据段
BUF DB 100
DB ?
DB 10 DUP(?)
DATA ENDS
CODE SEGMENT USE16 ; 定义代码段
ASSUME CS:CODE, DS:DATA
BEG: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET BUF
MOV AH, 0AH ; 功能号 0AH
INT 21H
MOV DX, OFFSET BUF+2 ; 从"BUF+2"的位置开始键入
MOV BX, DX ; 键入字符的个数
ADD BL, BUF+1
MOV BYTE PTR [BX], '$' ; 间接寻址
MOV AH, 09H ; 功能号09H[显示字符串]
INT 21H
MOV AH, 4CH
INT 21H ; 返回DOS
CODE ENDS
END BEG
♦ 说明:因为显示时重新刷新了屏幕,屏幕上原来输入时回显的字符串被去除了,同样内容的字符串被再次显示出来,所以屏幕上只看到了一个字符串 (并没有出现我们想看到的两个字符串 )。所以我们可以在 “单步调试” 中进行查看结果。
5、功能号 4CH (调用指令INT 21H)
■ 入口参数:AL = 返回码(或者不设置)。
■ 出口参数:无。
▶ 功能:终止当前程序的运行,并把控制权交给调用它的程序。
MOV AH, 4CH
INT 21H ; 返回DOS
三、BIOS常用功能调用
● DOS 功能调用的例子如下:【简单了解即可】
■ BIOS 调用模式:
BIOS 调用模式:
MOV AH, 功能号
设置入口参数
INT XXH (XXH为 BIOS 功能调用类型号)
分析出口参数
● BIOS 调用模式有两个常用的功能调用:键盘功能调用(INT 16H)、文本显示功能调用(INT 10H)。
1、功能号 00H (调用指令INT 16H)
■ 入口参数:无。
■ 出口参数:AL = 键入字符的 ASCII 码。若 AL = 0,则 AH = 输入键的扩展码。
▶ 功能:读取键入的一个字符,无回显,响应Ctrl_C,无键入则等待。
"举例:"
MOV AH, 00H
INT 16H
MOV CL, AL ; 获得键盘输入字符的 ASCII 码, 并放入 CL 寄存器
2、功能号 0EH (调用指令INT 16H)
■ 入口参数:AL = 待显字符的 ASCII 码。
■ 出口参数:无。
▶ 功能:在光标的当前位置显示一个字符,随后光标前进一格,满一行后自动换行,满一页则整屏信息上滚一 行。与 DOS 系统的 2 号功能调用具有相同的效果。
"举例:"
MOV AH, 0EH
MOV AL, 'A'
INT 10H ; 在文本屏幕上显示字符 A
🍻 国庆节快乐!