DOS功能调用及汇编语言程序设计举例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

DOS功能调⽤及汇编语⾔程序设计举例
DOS功能调⽤及汇编语⾔程序设计举例
5.1 DOS功能调⽤
DOS-磁盘操作系统,象WINDOS操作系统⼀样是进⾏计算机系统管理的软件,在WINDOS 以前,PC机上主要应⽤的是DOS 操作系统,两者间的最⼤区别是在DOS 操作系统下,⽤户可以利⽤⾃⼰所编的程序直接对外设(硬件端⼝)进⾏操作,如对磁盘进⾏读写,对打印机进⾏控制等,⽽在WINDOS操作系统下,⽤户只能通过特有的驱动程序才能对其进⾏操作,因为所有外设均被WINDOS操作系统统⼀管理,⽤户⽆法在⾃⼰的程序中对他门进⾏操作。

1、DOS功能
在PC机的操作系统(DOS)的安装过程中,将⼀些常⽤的⼦程序安装到了内存单元中,⽤户可以在编写⾃⼰的⽤户程序时,进⾏调⽤。

其中有两种:
BIOS⼦程序:功能管理与计算机相连接的外部设备(显⽰器、键盘、磁盘驱动)程序,称为基本输⼊输出系统(basic Input/output system)这部分程序是存放在ROM 区所以通常称为:ROM BIOS
DOS功能程序:与BIOS程序⼀样,DOS功能程序也是计算机操作系统开发⼈员编写的⼀些常⽤的⽤于磁盘⽂件管理的⼦程序,主要⽤于磁盘⽂件的建⽴、打开、读写、关闭,⽤户同样可以在⾃⼰的程序中对他们进⾏调⽤,简化⽤户程序的开发。

与BIOS不同的是DOS功能程序是存放在硬盘上的,在系统上电时,由操作系统,将其安装到内存中的,称为常驻内存程序。

⽤户调⽤这两种程序⼀般采⽤中断指令进⾏调⽤:
DOS功能的调⽤⽅法:
1、在AH中写⼊功能调⽤号
2、在指定的寄存器中设置⼊⼝参数
3、⽤INT 21 指令执⾏调⽤
4、根据出⼝参数分析调⽤执⾏情况
实际上,所有的DOS 功能⼦程序被组成了⼀个⼤程序存放在内存单元中,从nn1:nn2 开始的单元中,在操作系统上电进⾏系统初始化时,将nn1:nn2 存放到了中断向量表中,0000H:0084H开始的连续4个单元中,当⽤户在⽤户程序中⽤INT 21H 调⽤DOS的某⼀个功能时,即控制程序转移到nn1:nn2 开始的程序,在这段程序中⾸先根据AH中的功能,可以分析出⽤户调⽤的哪⼀个功能从⽽在转到相应地⽅执⾏相应的程序段。

以下以⼏个DOS功能的应⽤介绍DOS功能使⽤⽅法:
2、常⽤功能调⽤
1、键盘输⼊单字符并显⽰
调⽤号:01,⽆⼊⼝参数。

功能:等待键⼊,检查是否是Ctr - Break键,是,退出。

不是将键⼊的字符送AL 寄存器并显⽰。

MOV AH ,01
INT 21H
2、输出单字符
调⽤号:02,⼊⼝参数:DL
功能:将DL的内容显⽰(DL = 待输出字符的ASII码)
MOV DL ,‘A’
MOV AH,02
INT 21H
程序执⾏后,在显⽰器上显⽰字符A
3、输出字符串
调⽤号:09H,⼊⼝参数:DS:DX(缓冲区⾸地址)
功能:将缓冲区内以&结尾的字串显⽰,&(24H)不显⽰。

BUF DB ‘ABCDEF&’
MOV DX , OFFSET BUF
MOV AH , 09H
INT 21H
执⾏结果在显⽰器上显⽰ABCDEF
4、键盘输⼊字符串
调⽤号:0AH,
⼊⼝参数:DS:DX = 缓冲区⾸地址
功能:将键盘键⼊的以ENTER (0DH)结尾的字符串写到DS:DX指定的内存区。

为此,应先⽤程序设置⼀内存区。

例:从键盘输⼊⼀个字符串,写到从标号BUF开始的单元中
数据段:
BUF DB 20 第⼀个字节设的最⼤长度(含0DH)
DB ? 第⼆个字节空出,
由DOS功能最后填实际长度(不含0DH) DB 20 DUP (?) 第三字节开始写字符
程序段
MOV DX ,OFFSET BUF
MOV AH , 0AH
INT 21H
注:键⼊字符超出缓冲区范围,超出的字符丢失且响铃警告,若⼩于设置范围,保持原来内容5、返回操作系统
调⽤号:4CH ,⽆⼊⼝参数。

MOV AH ,4CH
INT 21H
结束当前程序,返回操作系统。

6、设置中断向量
调⽤号:25H ,
⼊⼝参数:AL = 中断类型号
DS:DX = 中断程序⼊⼝地址。

若中断类型号是40,中断程序⼊⼝地址0300:2400H,装中断向量。

MOV AX ,0300H
MOV DS ,AX
MOV DX ,2400H
MOV AH ,25H
MOV AL ,40
INT 21H
例将键盘输⼊的字符串显⽰在显⽰器上
DSG SEGMENT
BUF DB 80 DB ?
DB 80 DUP (’&’) 24H DSG ENDS
STA SEGMENT
ST DB 100H DUP (?) STA ENDS CSG SEGMEMT
ASSUMENT CS :CSG ,DS :DSG START :MOV AX ,DSG MOV DS ,AX MOV AX ,STA MOV SS ,AX MOV SP ,LENGTH ST MOV DX ,OFFSET BUF MOV AH ,0AH INT 21H
MOV DX ,OFFSET BUF+2 MOV AH, 09H INT 21H MOV AH, 4CH INT 21
CSG ENDS END
5.2 汇编语⾔程序设计举例 1、汇编语⾔程序编程步骤
(1)分析问题,对特定的问题进⾏抽象,例如,计算⼀个圆形的⾯积,这是⼀个物理问
题,可将其抽象为:2
R S π=
(2)确⽴算法:确⽴实现的⽅法,例如对于上例如何求解,可以⽤⾃然语⾔或流程图
等⽅法进⾏描述。

流程图的基本图素:起始和中⽌框
处理框
判断框
(3)程序编写
(4)通过汇编程序对所编写的程序进⾏编译,形成obj⽂件
(5)通过link 连接⽣成可执⾏⽂件
(4)调试、修改
4.4 汇编过程
1、⽤⾏编辑⽂件建⽴和修改源程序。

在我们作试验的系统上安装有⾏编辑⽂件EDLIN 这个⽂件主要⽤于汇编源程序的录⼊:
EDLIN ABC.ASM
如果是⼀个新⽂件将显⽰:
New file
* (录⼊所编写的源⽂件)
如果是⼀个已有⽂件将显⽰:EDLIN 将ABC⽂件装⼊并显⽰在显⽰器上
对原有的⽂件进⾏编辑、修改
End of input file
2、利⽤MASM⽂件将汇编语⾔源程序汇编为由机器码表⽰的⽬标⽂件。

〉MASM ABC
可以⽣成三个⽂件⽬标⽂件(*.OBJ), 列表⽂件( *.LST) ,交叉引⽤⽂件*.CRF
Object filename [ABC.OBJ]: 回车
Source filename[nul.LST]: 回车
Cross filename[nul.CRF]: 回车
Warning Errors: 0
Severe Errors: 0
3、利⽤LINK ⽂件将⽬标⽂件连接成可执⾏⽂件。

〉LINK ABC
Run file [ABC.OBJ]: 回车
List file[nul.LST]: 回车
Libraries file[nul.CRF]: 回车
Warning Errors: No STACK Segment
There was 1 error detected
4、在DOS下执⾏⽂件
〉ABC
4、⽤DEBUG调试程序。

C:> DEBUG ABC。

EXE
DEBUG程序是专门⽤于对程序进⾏调试的⼀个程序,
在DEBUG中提供了多种命令,⽤于实现程序的运⾏过程
g 全速运⾏命令
t 单步运⾏命令等
在DEBUG状态下有⼀个窗⼝⽤于显⽰CPU内部各个寄存器的当前值,同时可以观察到内存中指定单元单元的内容,从⽽帮助编程⼈员检测⾃⼰编的程序的运⾏状况。

例1 编写⼀个程序,将内存DS:1000H中存放的⼀个⽤8位⼆进制数不带符号数(⼩于100)变成组合BCD码,结果存放DS:2000单元中。

(1)分析问题,确定算法:
⼆进制数到BCD 码的转换算法: N/10-----〉商⼗位余数-----〉个位(2)画流程
从上诉流程中可见,程序中的每条指令的执⾏过程为顺序执⾏过程,所以成为顺序结构程序
3、编程(略)
例2 检查输⼊的字符,如果输⼊字符为 A 则显⽰,否则循环等待。

CODE SEGMENT
ASSUME CS :CODE STA : MOV AH ,01H
INT 21H ;键⼊Ctr-Break 结束 CMP AL ,41H JZ DISY JMP STA
DISY :MOV AH ,02H MOV DL ,AL INT 21H
MOV AH ,4CH INT 21H CODE ENDS
END STA
例:编写⼀个程序,将内存DS:1000H开始连续存放的⼗个8位⼆进制数不带符号数(⼩于100)变成组合BCD码,结果存放DS:2000开始的内存单元中。

1、分析算法
(1)⼆进制数到BCD码的转换算法:
N/10-----〉商⼗位余数-----〉个位
(2)程序结构:对于本题可采⽤以下两种程序结构
(1)循环结构:⼀般⽤于对⼀批数据进⾏集中的相同的处理
(2)主-⼦程序结构:⼀般⽤于分别对不同的数据进⾏同样的处理
循环结构:
对于循环条件的判断:
计数控制:事先已知循环次数,每次循环加或减计数,并判定总次数以达到控制循环。

条件控制:事先不知循环次数,在循环时判定某种条件的真假达到控制循环。

⼦程序的结构:
循环结构解法:
(1)循环体要解决的问题是对其中⼀个数的处理,即将⼀个内存单元中存放的⼆进制数变为组合BCD码,并存放到另⼀个内存单元中,这时可以假定SI、DI分别
指向这两个单元,然后根据算法进⾏处理;
(2)循环初始化:循环次数、使SI和DI指向特定的单元
(3)循环控制:使SI、DI指向下⼀个要处理的单元和存放结果的单元
(4)循环判断:(1)每次减“1”(或加“1”)(2)判断循环计数器是否为0或是否为计数预定值,是则推出循环,否则继续循环。

画流程:略
编程:略
⼦程序解法:
画流程图
⼦程序功能:将内存DS:SI所指单元的8位⼆进制数变成组合BCD码,存到内存由DS:DI所指定的开始单元。

⼊⼝参数:SI ⼆进制数地址
出⼝参数:DI=DI+2
2、编程
DA TSEG SEGMENT
DAT DB 10H ,0ABH ,4FH ,。

RESULT DW 10 DUP (0) DA TSEG ENDS CODSEG SEGMENT MAIN PROC far
ASSUME CS:CODSEG, DS:DA TSEG START: MOV AX, DATSEG MOV DS,AX
MOV SI, OFFSET DA T MOV DI,OFFSET RESULT MOV CX, 10
NEXT: CALL SONPROC INC SI DEC CX JNZ NEXT RET
SONPROC PROC NEAR PUSH CX
MOV AL ,[SI] CBW
MOV BL ,
100
DIV BL
MOV BL,AH
MOV AH,00H
MOV [DI],AX
INC DI
INC DI
MOV AL,BL
CBW
MOV BL,10
DIV BL
MOV CL,4
SHL AH,CL
OR AL,AH
MOV [SI],AX
INC DI
INC DI
恢复现场---〉POP CX
RET
SONPROC ENDP CODSEG ENDS
MAIN END。

相关文档
最新文档