汇编 DOS系统功能调INT 21H



表:DOS系统功能调INT 21H
AH
功能
调用参数
返回参数
00
程序终止(同INT 20H)
CS=程序段前缀
 
01
键盘输入并回显
 
AL=输入字符
02
显示输出
DL=输出字符
 
03
异步通迅输入
 
AL=输入数据
04
异步通迅输出
DL=输出数据
 
05
打印机输出
DL=输出字符
 
06
直接控制台I/O
DL=FF(输入)
DL=字符(输出)
AL=输入字符
07
键盘输入(无回显)
 
AL=输入字符
08
键盘输入(无回显)
检测Ctrl-Break
 
AL=输入字符
09
显示字符串
DS:DX=串地址
'$'结束字符串
 
0A
键盘输入到缓冲区
DS:DX=缓冲区首地址
(DS:DX)=缓冲区最大字符数
(DS:DX+1)=实际输入的字符数
0B
检验键盘状态
 
AL=00 有输入
AL=FF 无输入
0C
清除输入缓冲区并
请求指定的输入功能
AL=输入功能号
(1,6,7,8,A)
 
0D
磁盘复位
 
清除文件缓冲区
0E
指定当前缺省的磁盘驱动器
DL=驱动器号 0=A,1=B,...
AL=驱动器数
0F
打开文件
DS:DX=FCB首地址
AL=00 文件找到
AL=FF 文件未找到
10
关闭文件
DS:DX=FCB首地址
AL=00 目录修改成功
AL=FF 目录中未找到文件
11
查找第一个目录项
DS:DX=FCB首地址
AL=00 找到
AL=FF 未找到
12
查找下一个目录项
DS:DX=FCB首地址
(文件中带有*或?)
AL=00 找到
AL=FF 未找到
13
删除文件
DS:DX=FCB首地址
AL=00 删除成功
AL=FF 未找到
14

顺序读

DS:DX=FCB首地址

AL=00 读成功
  =01 文件结束,记录中无数据
  =02 DTA空间不够
  =03 文件结束,记录不完整
15
顺序写
DS:DX=FCB首地址
AL=00 写成功
  =01 盘满
  =02 DTA空间不够
16
建文件
DS:DX=FCB首地址
AL=00 建立成功
  =FF 无磁盘空间
17
文件改名
DS:DX=FCB首地址
(DS:DX+1)=旧文件名
(DS:DX+17)=新文件名
AL=00 成功
AL=FF 未成功
19
取当前缺省磁盘驱动器
 
AL=缺省的驱动器号 0=A,1=B,2=C,...
1A
置DTA地址
DS:DX=DTA地址
 
1B

取缺省驱动器FAT信息

 
AL=每簇的扇区数
DS:BX=FAT标识字节
CX=物理扇区大小
DX=缺省驱动器的簇数
1C
取任一驱动器FAT信息
DL=驱动器号
同上
21

随机读

DS:DX=FCB首地址

AL=00 读成功
  =01 文件结束
  =02 缓冲区溢出
  =03 缓冲区不满
22
随机写
DS:DX=FCB首地址
AL=00 写成功
  =01 盘满
  =02 缓冲区溢出
23
测定文件大小
DS:DX=FCB首地址
AL=00 成功(文件长度填入FCB)
AL=FF 未找到
24
设置随机记录号
DS:DX=FCB首地址
 
25
设置中断向量
DS:DX=中断向量
AL=中断类型号
 
26
建立程序段前缀
DX=新的程序段前缀
 
27

随机分块读

DS:DX=FCB首地址
CX=记录数
AL=00 读成功
  =01 文件结束
  =02 缓冲区太小,传输结束
  =03 缓冲区不满
28
随机分块写
DS:DX=FCB首地址
CX=记录数
AL=00 写成功
  =01 盘满
  =02 缓冲区溢出
29
分析文件名
ES:DI=FCB首地址
DS:SI=ASCIIZ串
AL=控制分析标志
AL=00 标准文件
  =01 多义文件
  =02 非法盘符
2A
取日期
 
CX=年
DH:DL=月:日(二进制)
2B
设置日期
CX:DH:DL=年:月:日
AL=00 成功
  =FF 无效
2C
取时间
 
CH:CL=时:分
DH:DL=秒:1/100秒
2D
设置时间
CH:CL=时:分
DH:DL=秒:1/100秒
AL=00 成功
  =FF 无效
2E
置磁盘自动读写标志
AL=00 关闭标志
AL=01 打开标志
 
2F
取磁盘缓冲区的首址
 
ES:BX=缓冲区首址
30
取DOS版本号
 
AH=发行号,AL=版本
31
结束并驻留
AL=返回码
DX=驻留区大小
 
33

Ctrl-Break检测

AL=00 取状态
  =01 置状态(DL)
DL=00 关闭检测
  =01 打开检测
DL=00 关闭Ctrl-Break检测
  =01 打开Ctrl-Break检测
35
取中断向量
AL=中断类型
ES:BX=中断向量
36


取空闲磁盘空间


DL=驱动器号 
0=缺省,1=A,2=B,...

成功:AX=每簇扇区数
     BX=有效簇数
     CX=每扇区字节数
     DX=总簇数
失败:AX=FFFF
38
置/取国家信息
DS:DX=信息区首地址
BX=国家码(国际电话前缀码)
AX=错误码
39
建立子目录(MKDIR)
DS:DX=ASCIIZ串地址
AX=错误码
3A
删除子目录(RMDIR)
DS:DX=ASCIIZ串地址
AX=错误码
3B
改变当前目录(CHDIR)
DS:DX=ASCIIZ串地址
AX=错误码
3C
建立文件
DS:DX=ASCIIZ串地址
CX=文件属性
成功:AX=文件代号
错误:AX=错误码
3D

打开文件

DS:DX=ASCIIZ串地址
AL=0 读
  =1 写
  =3 读/写
成功:AX=文件代号
错误:AX=错误码
3E
关闭文件
BX=文件代号
失败:AX=错误码
3F

读文件或设备

DS:DX=数据缓冲区地址
BX=文件代号
CX=读取的字节数
读成功:
  AX=实际读入的字节数
  AX=0 已到文件尾
读出错:AX=错误码
40
写文件或设备
DS:DX=数据缓冲区地址
BX=文件代号
CX=写入的字节数
写成功:
  AX=实际写入的字节数
写出错:AX=错误码
41
删除文件
DS:DX=ASCIIZ串地址
成功:AX=00
出错:AX=错误码(2,5)
42


移动文件指针


BX=文件代号
CX:DX=位移量
AL=移动方式(0:从文件头绝对位移,1:从当前位置相对移动,2:从文件尾绝对位移)
成功:DX:AX=新文件指针位置
出错:AX=错误码

43

置/取文件属性

DS:DX=ASCIIZ串地址
AL=0 取文件属性
AL=1 置文件属性
CX=文件属性
成功:CX=文件属性
失败:CX=错误码
44




设备文件I/O控制




BX=文件代号
AL=0 取状态
  =1 置状态DX
  =2 读数据
  =3 写数据
  =6 取输入状态
  =7 取输出状态
DX=设备信息




45
复制文件代号
BX=文件代号1
成功:AX=文件代号2
失败:AX=错误码
46
人工复制文件代号
BX=文件代号1
CX=文件代号2
失败:AX=错误码
47
取当前目录路径名
DL=驱动器号
DS:SI=ASCIIZ串地址
(DS:SI)=ASCIIZ串
失败:AX=出错码
48
分配内存空间
BX=申请内存容量
成功:AX=分配内存首地
失败:BX=最大可用内存
49
释放内容空间
ES=内存起始段地址
失败:AX=错误码
4A
调整已分配的存储块
ES=原内存起始地址
BX=再申请的容量
失败:BX=最大可用空间
     AX=错误码
4B

装配/执行程序

DS:DX=ASCIIZ串地址
ES:BX=参数区首地址
AL=0 装入执行
AL=3 装入不执行
失败:AX=错误码

4C
带返回码结束
AL=返回码
 
4D
取返回代码
 
AX=返回代码
4E
查找第一个匹配文件
DS:DX=ASCIIZ串地址
CX=属性
AX=出错代码(02,18)
4F
查找下一个匹配文件
DS:DX=ASCIIZ串地址
(文件名中带有?或*)
AX=出错代码(18)
54
取盘自动读写标志
 
AL=当前标志值
56
文件改名
DS:DX=ASCIIZ串(旧)
ES:DI=ASCIIZ串(新)
AX=出错码(03,05,17)
57
置/取文件日期和时间
BX=文件代号
AL=0 读取
AL=1 设置(DX:CX)
DX:CX=日期和时间
失败:AX=错误码
58
取/置分配策略码
AL=0 取码
AL=1 置码(BX)
成功:AX=策略码
失败:AX=错误码
59

取扩充错误码

 
AX=扩充错误码
BH=错误类型
BL=建议的操作
CH=错误场所
5A
建立临时文件
CX=文件属性
DS:DX=ASCIIZ串地址
成功:AX=文件代号
失败:AX=错误码
5B
建立新文件
CX=文件属性
DS:DX=ASCIIZ串地址
成功:AX=文件代号
失败:AX=错误码
5C


控制文件存取


AL=00封锁
  =01开启
BX=文件代号
CX:DX=文件位移
SI:DI=文件长度
失败:AX=错误码


62
取程序段前缀
 
BX=PSP地址
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
XXXX大学 实验报告 "课程名称 "汇编语言程序设计 "成 " " " " "绩 " " "实验学时 " " " " "评语: " " " " " " " " " " " " " "指导教师: " " " "年 月 日 " 班 级: 学 号: 姓 名: 地 点: 时 间: 实验一 汇编语言编程实验 一、实验目的 1) 掌握汇编语言的编程方法 2) 掌握DOS功能调用的使用方法 3) 掌握汇编语言程序的试运行过程 二、实验内容 1. 将指定数据区的字符串数据以ASCII码形式显示在屏幕上,并通过DOS功能调用完成 必要提示信息的显示。 2. 在屏幕上显示自己的学号姓名信息。 3. 循环从键盘读入字符并回显在屏幕上,然后显示出对应字符的ASCII码,直到输入 "Q"或"q"时结束。 4. 实验中使用的DOS功能调用INT 21H "AH 值 "功 能 " 用 参 数 "结 果 " "1 "键盘输入并回显 " "AL=输出字符 " "2 "显示单个字符(带Ctrl+Bre"DL=输出字符 "光标在字符后 " " "ak检查) " "面 " "6 "显示单个字符(无Ctrl+Bre"DL=输出字符 "光标在字符后 " " "ak检查) " "面 " "8 "从键盘上读一个字符 " "AL=字符的ASCI" " " " "I码 " "9 "显示字符串 "DS:DX=串地址, "光标跟在串后 " " " "'$'为结束字符 "面 " "4CH "返回DOS系统 " "AL=返回码 " 例如,实键盘输入并回显的完整代码: MOV AH 01H INT 21H 三、实验结果 1. 将指定数据区的字符串数据"Let us go !"以ASCII码形式显示在屏幕上,并通过DOS功能调用完成必要提示信息的显示: 2. 在屏幕上显示自己的学号姓名信息 3. 循环从键盘读入字符并回显在屏幕上,然后显示出对应字符的ASCII码,直到输入" Q"或"q"时结束。 四、实验原理 DATA SEGMENT MES DB 'NUMBER: 03099018 ',0AH,0DH,'NAME: Feng Xiaokang',0AH,0DH,'$' CENT DB 'Let us go !','$' ENTE DB 0AH,0DH,'$' INFO DB 'Origin: ','$' ASCI DB 'ASCII : ','$' MSG1 DB 'If you want to quit please press...q/Q...',0AH,0DH,'$' MSG2 DB 0AH,0DH,'Char: $' RS DB ' ASCII: $' SD DB '' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA ;存储数据 MOV DS,AX MOV DX,OFFSET MES ;显示数据 MOV AH,09H INT 21H MOV DX,OFFSET MSG1 MOV AH,09H INT 21H MOV DX, OFFSET CENT MOV SI, DX T: MOV AL,[SI] CMP AL,'$' JZ C1 AND AL,0F0H ;取高4位 MOV CL,4 SHR AL,CL CMP AL,0AH ;是否是A以上的数 JB A ADD AL,07H A: ADD AL,30H MOV DL,AL ;show character MOV AH,02H INT 21H ;MOV AL,DS:[SI] MOV AL, [SI] AND AL,0FH ;取低4位 CMP AL,0AH JB B ADD AL,07H B: ADD AL,30H MOV DL,AL MOV AH,02H INT 21H INC SI LOOP T C1: MOV DX,OFFSET MSG2 MOV AH,09H INT 21H MOV AH,01h INT 21h CMP AL,'q' JE exit CMP AL,'Q' JE exit MOV SD,AL MOV DX,OFFSET RS ;show message MOV AH,09H INT 21H MOV SI,OFFSET SD MOV AL,[SI] AND AL,0F0H ;取高4位 MOV CL,4 SHR AL,CL CMP AL,0AH ;是否是A以上的数 JB C2 ADD AL,07H C2: ADD AL,30H MOV DL,AL ;show character MOV AH,02H INT 21H MOV AL,DS:[SI] AND AL,0FH ;取低4位 CMP AL,0AH JB C3 ADD A
华中科技大学汇编实验 源代码及实验报告 2.1 任务1. 《80X86汇编语言程序设计》教材中 P31的 1.14题。 要求: (1) 直接在TD中输入指令,完成两个数的求和、求差的功能。求和/差后的结果放在(AH)中。 (2) 请事先指出执行指令后(AH)、标志位 SF、OF、CF、ZF的内容。 (3) 记录上机执行后的结果,与(2)中对应的内容比较。 (4)求差运算中,若将A、B视为有符号数,且A>B, 标志位有何特点? 若将A、B视为无符号数,且A>B, 标志位又有何特点? 2.2 任务2. 《80X86汇编语言程序设计》教材中 P45的 2.3题。 要求: (1)分别记录执行到“MOV CX,10”和“INT 21H”之前的(BX), (BP),(SI),(DI)各是多少。 (2)记录程序执行到退出之前数据段开始40个字节的内容,指出程序运行结果是否与设想的一致。 (3)在标号LOPA前加上一段程序,实新的功能:先显示提示信息“Press any key to begin!”, 然后,在按了一个键之后继续执行LOPA处的程序。 2.3 任务3. 《80X86汇编语言程序设计》教材中 P45的 2.4题的改写。 要求: (1) 实功能不变,对数据段中变量访问时所用到的寻址方式中的寄存器改成32位寄存器。 (2) 内存单元中数据的访问采用变址寻址方式。 (3) 记录程序执行到退出之前数据段开始40个字节的内容,检查程序运行结果是否与设想的一致。 (4)在TD代码窗口中观察并记录机器指令代码在内存中的存放形式,并与TD中提供的反汇编语句及自己编写的源程序语句进行对照,也与任务2做对比。(相似语句记录一条即可,重点理解机器码与汇编语句的对应关系,尤其注意操作数寻址方式的形式)。 (5)观察连续存放的二进制串在反汇编汇编语言语句时,从不同字节位置开始反汇编,结果怎样?理解 IP/EIP指明指令起始位置的重要性。 2.4 设计实一个学生成绩查询的程序。 1、实验背景 在以BUF为首址的字节数据存储区中,存放着n个学生的课程成绩表(百分制),每个学生的相关信息包括:姓名(占10个字节,结束符为数值0),语文成绩(1个字节),数学成绩(1个字节),英语成绩(1个字节),平均成绩(1个字节)。 2、功能一:提示并输入待查询成绩的学生姓名 (1)使用9号DOS系统功能调用,提示用户输入学生姓名。 (2)使用10号DOS系统功能调用,输入学生姓名。输入的姓名字符串放在以in_name为首址的存储区中。 (3)若只是输入了回车,则回到“(1)”处重新提示与输入;若仅仅输入字符q,则程序退出,否则,准备进入下一步处理。 3、功能二:以学生姓名查询有无该学生 (1)使用循环程序结构,在成绩表中查找该学生。 (2)若未找到,就提示用户该学生不存在,并回到“功能一(1)”的位置,提示并重新输入姓名。 (3)若找到,则将该学生课程成绩表的起始偏移地址保存到POIN字变量中。 4、功能三:计算所有学生的平均成绩 使用算数运算相关指令计算并保存每一个学生的平均成绩。 平均成绩计算公式:(A*2+B+C/2)/3.5,即将语文成绩A乘以权重2、英语成绩C除以权重2后,与数学成绩B一起求和,再计算该生的平均成绩。要求避免溢出。 5、功能四:将功能二查到的学生的平均成绩进行等级判断,并显示判断结果。 (1)平均成绩等级显示方式:若平均成绩大于等于90分,显示“A”;大于等于80分,显示“B”;大于等于70分,显示“C”;大于等于60分,显示“D”;小于60分,显示“F”。 提示:使用分支程序结构,采用2号DOS系统功能调用显示结果。 (2)使用转移指令回到“功能一(1)”处(提示并输入姓名)
### 回答1: int 21h中断的2#号系统是读取键盘输入,也被称为DOS的标准输入函数。当该中断被调用时,程序会等待用户在键盘上输入一个字符,然后将该字符放入程序的缓冲区中。如果用户输入的是可显示字符(如字母、数字、符号等),则该字符会在屏幕上显示出来。如果用户输入的是控制字符(如退格、回车、Tab等),则相应的操作会被执行。 ### 回答2: int 21h是一种软中断,广泛用于汇编语言中,特别是DOS和Windows操作系统。其中断的目的是向操作系统请求服务或执行各种与输入输出相关的功能int 21h中断的2号功能是读取键盘输入。当程序执行到int 21h指令,并设置寄存器AH的值为2时,操作系统将会检查键盘的状态,并将读取到的字符存放在寄存器AL中。 通过这种方式,程序可以获取用户从键盘输入的信息,然后根据需要对其进行处理。比如,在命令行界面下,用户可以通过键盘输入命令名称或参数等,程序可以使用int 21h中断的2号功能来读取到用户的输入,并根据输入执行相应的操作。 在使用int 21h中断的2号功能时,需要注意以下几点: 1. 判断键盘缓冲区是否有字符可读,如果没有可读字符,程序可以进行等待,直到有字符可以读取。 2. 每次只读取一个字符,可以通过循环的方式读取多个字符。 3. 检查读取到的字符是否是控制字符,比如回车键、退格键等,这些字符需要根据需要进行处理。 4. 读取到的字符一般是ASCII码表示的,需要根据具体的需求进行转换,比如转换为相应的数字或字符。 总之,int 21h中断的2号功能汇编语言中是非常有用的工具,可以方便地获取用户的键盘输入并进行相应的处理。 ### 回答3: int 21h 中断是在汇编语言中的一种软中断,其实际上是调用DOS操作系统提供的功能服务。其中断号2h是其中的一个具体服务,用于在屏幕上输出字符。 当我们使用int 21h, ah=02h的指令时,即通过将ah寄存器设置为02h来调用此中断服务。在调用前,我们需要将要输出的字符的ASCII码放入dl寄存器中。通过该中断服务,DOS操作系统将会在屏幕上输出对应ASCII码的字符。 例如,我们将要输出的字符的ASCII码存储在dl寄存器中,然后通过 int 21h, ah=02h的指令来调用中断服务。DOS操作系统将会将对应的字符输出到屏幕上。 需要注意的是,调用此中断服务的程序必须位于DOS环境下,因为该中断服务是通过DOS提供的功能来实的。在其他操作系统或环境下无法正常运行。 int 21h中断的功能非常丰富,除了可以进行屏幕输出之外,还可以进行文件操作、键盘输入等。其中断号2h只是其中的一种服务之一。因此,在编写汇编程序时,我们可以根据具体需要选择其他的调用方式和中断服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值