能否帮我总结一下int21的所有子功能,如4ch,09h,02h等

2025-02-23 18:46:20
推荐回答(1个)
回答1:

int 21 dos 系统功能调用:
1 从键盘输入一个字符并回显在屏幕上
2 显示一个字符
5 打印一个字符
6 读键盘字符
7 从键盘输入一个字符,不回显
8 从键盘输入一个字符,不回显
9 显示字符串
a 输入字符到缓冲区(ds:dx=缓冲区首址)
b 读键盘状态
c 清除键盘缓冲区,并调用一种键盘功能(al=键盘功能号)
f 打开文件
10 关闭文件
14 顺序读
15 顺序写
16 建立文件
1a 置dta地址
21 随机读
22 随机写
23 测文件大小
25 设置中断向量
27 随机分块读
28 随机分块写
2a 获取系统日期
2b 设置系统日期
2c 获取系统时间
2d 设置系统时间
35 取中断向量

子功能的操作:
1号子功能:从键盘输入一个字符并回显在屏幕上
返回参数:(al)<=输入字符的ascii码

2号子功能:显示一个字符
设置参数:(dl)<=要显示的字符

5号子功能:打印一个字符
设置参数:(dl)<=要打印的字符

6号子功能:显示一个字符
设置参数:(dl)<=要显示的字符

9号子功能:显示字符串
设置参数:(ds:dx)<=要显示的字符串地址
待显字符串存放在一个数据缓冲区,以"$"作为结束标志,且所显示内容必须是可显示的ascii码,否则会产生不可预料的结果。

a号子功能:输入字符到缓冲区( 当用户输入回车键时,结束输入;调用该功能前,在内存中建立一个输入缓冲区)
入口参数:(ds:dx)<=输入缓冲区的首地址;
出口参数:(ds:dx+2)<=实际输入字符数。

f号子功能:打开文件
设置参数:
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=找到置00否则置ff

10号子功能:关闭文件
设置参数:
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=修改成功置00否则置ff

14号子功能:顺序读
设置参数:
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=0为读成功;1为记录中无数据;2为空间不够;3为记录不完整

15号子功能:顺序写
设置参数:
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=0为写成功,1盘满,2为空间不够

16号子功能:建立文件
设置参数:
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=建立成功置00否则置ff

1a号子功能:置dta地址
设置参数:
ds<=fcb的段地址
dx<=fcb的偏移地址

21号子功能:随机读
设置参数:
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=0为读成功;1为文件结束;2为dat太小,传输结束;3为读到部分记录

22号子功能:随机写
设置参数:
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=0为写成功;1盘满;2为dat太小,传输结束

23号子功能:测文件大小
设置参数:
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=找到置00否则置ff

25号子功能:设置中断向量
设置参数:
al<=中断类型号
ds:dx<=中断向量

27号子功能:随机分块读
设置参数:
cx<=要读取的记录数
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=0为全部记录读成功;1为文件结束,最后记录完整;2为dat太小,传输结束;3为文件结束,最后记录不完整
cx<=读取的实际记录数

28号子功能:随机分块写
设置参数:
cx<=要写取的记录数
ds<=fcb的段地址
dx<=fcb的偏移地址
返回参数:
al<=0为全部记录写成功;1为盘满;2为dat空间满
cx<=写取的实际记录数

2a号子功能:获取系统日期
返回参数:
(cx)<=年(1980-2099)
(dh)<=月(1-12)
(dl)<=日(1-31)
(al)<=星期(0-6)

2b号子功能:设置系统日期
设置参数:
(cx)<=年(1980-2099)
(dh)<=月(1-12)
(dl)<=日(1-31)
(al)<=星期(0-6)
返回参数:
al<=设置成功置00否则置ff

2c号子功能:获取系统时间
返回参数:
(ch)<-时(0-23)
(cl)<-分(0-59)
(dh)<-秒(0-59)
(dl)<-百分秒(0-9)

2d号子功能:设置系统时间
设置参数:
(ch)<-时(0-23)
(cl)<-分(0-59)
(dh)<-秒(0-59)
(dl)<-百分秒(0-9)
返回参数:
al<=设置成功置00否则置ff

35号子功能:取中断向量
设置参数:
al<=中断类型号
返回参数:
es:bx<=中断向量

用户定义的输入缓冲区格式:
aa,bb,cc,...,dh。
aa为用户定义的最多可键入字符数;
bb用户实际输入的字符数,不包括回车符;
cc字符串开始的字符;
0d回车符
例如:
data1 segment
var1 db 5,0,5 dup(0);定义缓冲区
data1 ends
lea dx,var1 ;设置缓冲区的首地址
mov ah,0ah
int 21h
lea si,var1+2 ;加载字符串开始地址
mov ch,var1+1 ;获得字符数

文件控制块fcb:
fcb是用户程序和操作系统之间传递有关磁盘文件信息的存储区,它一般定义在程序的数据段,共36个字分为10个信息。
例如:dj.txt文件在数据段定义的fcb:
tab1 label byte
0 drive db 4 磁盘驱动器:0为默认驱动器,1为驱动器a,2为驱动器b,...
1-8 name db 'dj' 文件名(不足8个字节时,用空格补足)
9-11 ext db 'txt' 扩展名(不足3个字节时,用空格补足)
12-13 curr_block dw 0 当前块号(一块有128个记录)
14-15 rec_size dw 0 记录大小
16-19 size dw 2 dup(?) 文件大小(记录号*记录大小)
20-21 date dw ? 日期
22-31 position db 10dup(?) 由dos自动填入
32 curr_rec db 0 当前记录号
33-36 rel_rec dw 2dup(?) 随机记录号