1、21预备知识:DOS 系统功能调用1概述DOS (Disk Operating System)是计算机的磁盘操作系统,它有两个重要的 DOS 模块:(1)IBMBIOCOM,称为基本输入输出设备处理程序,它提供了 DOS 到 ROM BIOS(Basic InputOutput System)的低级接口,完成将数据从外设读入内存,或将数据从内存写入外设中去的工作;(2)IBMDOSCOM,它包含文件管理程序和其他一些处理程序。在 DOS 下运行的程序都可以用中断方式调用上面提到的 I0 设备处理程序、文件管理等程序,实现用户对 I/O 或文件管理的要求,这就称为“DOS 系统功能调用” 。为了
2、完成 DOS 调用,IBMDOSCOM 将信息传送给 IBMBIOSCDM,形成 1 个或多个 BIOS调用。它们之间的关系如图所示。在有些情况下,既能选择 DOS 中断,也能选择 BIOS 中断来执行同样的功能。所以应尽量使用 DOS 中断功能,但是还有一些情况,由于没有等效的 DOS 中断功能,必须使用 BIOS中断功能。 DOS 中断可处理多数的 IO,但有一些功能还没有提供,如声音控制,这就要考虑用IO 指令在端口级进行编程,或使用高级语言编程来实现。2DOS 系统 功能调用(1)DOS 系统 功能调用方法一般调用时要包含以下 3 部分内容:入口参数初始化;子程序编号送人 AH;子程序
3、请求中断指令:INT 21H。一般采用 INT 21 H 调用 DOS 功能。有的子程序不要入口参数,但大部分需要将参数送入指定地点。调用结束时,如有出口参数,一般存放在寄存器中。(2)I0 DOS 系统功能调用实例键盘单个字符输入/输出(a) AH=1、7、8:键盘单个字符输入功能调用。以 AH1 为例:MOV AH,11NT 21H执行上述指令,将扫描键盘,一旦有键按下,就将相应键的 ASCII 码读入;先检查是否是按下键,如是则退出命令执行;否则将键值送人 AL 寄存器,同时将这个字符显示在屏幕上。AH=7 等待从标准输入设备输入字符,然后将其送入 AL,但不显示,也不对字符进22行检查
4、。AH=8 功能与 AH=1 类同,只是不在屏幕上显示(b) AH=2:键盘单个字符输出功能调用。它要求将显示字符的 ASCII 码(入口参数)送给寄存器 DL。显示时,光标跟随字符移动,并检查是否按下键,如果是按下此键,则退出命令执行。例如,下面代码实现将字符“A”送人屏幕显示:MOV DL,41H ;大写字符A的 ASCII 编码MOV AH,2 ;功能号 02H 送 AH1NT 21H ;中断 21H,DOS 系统功能调用输出字符串AH=9 的功能是显示字符串。它要求 DS:DX 必须指向内存中 1 个以“$”作为结束的字符串。如果希望光标自动换行,可在字符串结束以前加上回车和换行符的
5、ASCII 码。A1 DB 41H,42H,43H,0AH,0DH,$ ;数据段定义字符串 A、B、C ;0AH 是换行、0DH 是回车符号LEA DX,A1 ;A1 偏移地址送 DXMOV AH,09H ;AH09H,显示 A1 输入字符串INT 21H ;中断 21H,DOS 功能调用 字符串输 入AH=lO 功能是从键盘接收字符串到用户定义的输入缓冲区中。缓冲区内第一个字节指出缓冲区所能容纳的字符个数。如果键入的字符数比此数字大,就会发出“嘟嘟”声,而且光标不再向右移动;如输入的字符数少于定义的字节数,缓冲区其余的字节填以 0。缓冲区内第二个字节是实际输入的字符个数,这个数据由该功能自动
6、填入。从第三个字节开始,依次按字节存放从键盘上接收到的字符,最后结束字符串的回车符 0DH 还要占用 1 字节,所以整个缓冲区的大小应为最大字符数(包括回车符在内)加上 2。调用时,要求DS:DX 指向输入缓冲区。例如:DATA SEGMENTBUF DB 16 ;缓冲区长度DB 9 ;保留为系统填人实际输入的字符个数DB 16 DUP(?) ;定义 32Byte 的存储空间 DATA ENDSCODE SEGMENT MOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFMOV AH,10 INT 21HCODE ENDS如果我们键入字符串:HOW DO YOU DO?
7、此时缓冲区 BUF 中各单元内容如下:23实验五 汇编语言程序设计和调试(二)DOS 功能调用一实验目的与要求1、进一步熟悉 8086/8086 汇编语言的基本指令系统2、初步了解 DOS 系统功能调用在汇编语言程序中的应用二实验准备1. PC 系列微型计算机一台;2. 软件安装 DOS 系统、含 EDIT.EXE、MSAM.EXE 、LINK.EXE 或其他软件编辑工具;3. C 盘下创建 MASM 目录。三实验要求1启动计算机并进入 DOS 状态和 MASM 子目录。2在当前盘的 MASM 目录下用 EDIT 编辑工具将自己编写的源程序编辑成一个源程序文件,以“文件名.ASM”名称存储在当
8、前盘。3使用 MASM 对源程序汇编,生成目标程序文件(文件名.OBJ)(注:若汇编出错,找出错误原因并进行修改,直至正确)(1)命令格式及操作过程。(2)汇编结束后记录屏幕所显示的内容。4返回 EDIT 环境查看列表文件(1)命令格式及操作过程。(2)记录屏幕所显示的内容。5使用 LINK 软件生成可执行程序文件(文件名.EXE)(1)命令格式及操作过程。(2)记录屏幕所显示的内容。6运行生成可执行程序文件(文件名.EXE)(1)命令格式及操作过程。(2)记录屏幕所显示的内容。7在 DEBUG 状态下装入文件名.EXE,按要求调试程序。8用 DEBUG 的 D 命令查看程序区。9用 DEBU
9、G 的 U 命令反汇编出全代码段的语句。10用 DEBUG 的 T 命令,按步数运行该程序,并用 R 或 D 命令查看结果。四实验内容和实验步骤10 0E H O W D O Y O U D O ? 0D 0024使用 EDIT、MASM 和 LINK 等程序实现以下汇编语言源程序的输入、汇编、链接、调试和运行。1、程序一:显示预先输入的字符串(1)源程序:NAME EXAMP1 SS_SEG SEGMENT PARA STACKSTACK DB 100H DUP(0) SS_SEG ENDS DS_SEG SEGMENT A1 DB Assembly Language and Program
10、ming,0AH,0DH, $ A2 DB 41H,42H ,43H,0AH,0DH ,$ DS_SEG ENDS CS_SEG SEGMENT ASSUME CS:CS_SEG,DS:DS_SEG,SS:SS_SEG MAIN PROC FAR START: PUSH DS XOR AX,AX PUSH AXMOV AX,DS_SEG MOV DS,AXMOV AX,SS_SEG MOV SS,AX LEA DX,A1 ; D0S 功能调用入口参数,A1 为屏显首址. MOV AH,09H ; D0S 功能调用号INT 21H ; 中断号MOV DX,OFFSET A2 INT 21H RE
11、T MAIN ENDP CS_SEG ENDS ENDS START (2)实验步骤:(1)利用 EDIT 全屏幕编辑程序的编辑功能输入以上程序,以文件名为 LX51.ASM 存入C 盘 MASM 子目录下。(2)在 DOS 系统下执行执行文件 MASM.EXE ,用宏汇编程序将 LX51.ASM.汇编成目标文件 LX51.OBJ(3) 运行 LINK 执行文件将目标文件 LX51.OBJ 连接成为可执行的文件 LX51.EXE。(4) 查看列表文件 LX51.LST ,键入 C:MASMEDIT LX51.LST观察显示列表文件内容,记录有关内容:25 数据段的起始单元的偏移地址:数据段中变
12、量 A1、A2 的偏移地址:数据段占有字节数:数据段中变量 A1 单元存放的数据:A2 单元存放的数据: 代码段中从 START 标号开始的 13 句指令的机器码为:(5)在 DOS 环境下运行程序,命令格式为:C:MASM5 LX51.EXE (运行可执行文件) 程序运行结束屏幕所显内容为:(6)在 MASM 目录下输入如下命令,写出屏幕所显示的内容:C:MASM DEBUG LX51.EXE(7)在 DEBUG 状态下用 U 命令观察屏幕所显示的内容,写出: 代码段的首单元的段地址和偏移地址: 和 LX51.LST 文件显示的代码段指令比较,从 START 开始的 13 句指令的机器码及其
13、存放的地址有否区别:26 数据段和堆栈段的段基地址分别为:(8)根据数据段的段地址,在 DEBUG 状态下输入显示存储单元 D 命令,检查变量A1、A2 的地址及其存放的数据:(9)在 DEBUG 下采用 G 命令运行程序,命令格式为: G= 0000 (RET 指令的地址)写出屏幕所显示的内容:(10)若要求程序执行后在屏幕上显示:1 2 3 4 51 2 3 1请修改源程序中数据段的内容,然后调试运行,给予实现。写出修改的程序内容:DS_SEG SEGMENTA1 DB A2 DB DB DS_SEG ENDS2、程序二:将键盘输入的字符在下行显示(1)源程序:NAME EXAMP3 DA
14、TA SEGMENTMESSAGE DB PLEASE INPUT A STRING: $ ;定义输入提示BUF DB 255 , ? , 255 DUP(0) DATA ENDSCODE SEGMENT27ASSUME CS: CODE , DS: DATASTART: MOV AX , DATAMOV DS , AXMOV DX , OFFSET MESSAGEMOV AH , 9INT 21H ;显示输入提示信息MOV DX , OFFSET BUFMOV AH , 10INT 21H ;接收用户输入MOV AH , 2MOV DL , 0AH ;0AH 为换行符 ASCII 码INT
15、21H ;屏幕换行MOV BL , BUF+1 ;用户实际输入字符数BLMOV BH , 0 ;将 BX 高 8 位清 0,使 BX=用户实际输入字符数MOV BYTE PTR BUF+2BX,$;在用户输入的字符结束处放置一个“$”MOV DX , OFFSET BUF+2 ;用户实际输入字符起始处DXMOV AH , 9INT 21H ;显示用户输入的字符MOV AH , 4CHINT 21HCODE ENDSEND START(2)实验步骤:(1)输入、汇编、链接程序 LX51.ASM。(2)在 DOS 环境下运行程序,并按提示输入不多于 255 个数的字符,最后以回车键表示结束,观察并记下程序执行实现的功能:(3)在 DEBUG 状态下装入 LX52.EXE 程序进行调试 用 U 命令观察 19 条指令的机器码 :28 用 D 命令检查 MESSAGE 内存区域和 BUF 内存区域存放的数据: G 命令运行程序后,实现的功能:用 D 命令再次检查 MESSAGE 内存区域和 BUF 内存区域存放的数据: