《PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第6章》由会员分享,可在线阅读,更多相关《PC汇编语言程序设计 本科 教学课件 ppt 作者 王闵 第1-7章_ 第6章(68页珍藏版)》请在金锄头文库上搜索。
1、第六章 系统功能子程序的调用,6.1 DOS系统功能子程序的调用 6.2 BIOS功能子程序的调用 习题六,6.1 DOS系统功能子程序的调用,6.1.1 DOS(INT 21H)的常用功能调用 1 01号功能从键盘输入一个字符并显示 其格式为: MOV AH, 01H INT 21H,当程序执行到INT 21H后,等待用户从键盘输入一个字符,将输入字符的码值装入AL寄存器,并在屏幕上显示该字符。若按下CtrlC组合键, 则停止程序执行,返回DOS。1号功能不用入口参数,执行的结果在寄存器AL中。需要特别注意的是: AL寄存器中的值是输入字符的ASCII码值。例如,当用户按下数字键“”时, A
2、L中的值是31H, 程序中要想真正取得数字1, 还需作(AL)-30H的处理。 当用户输入一个字符后,机器自动执行INT 21H下面的指令。 和号功能基本类同的还有号功能、号功能。其中, 号功能与号功能的差别只是输入的字符不在屏幕上显示。 号功能与号功能的差别,除了在屏幕上不显示输入字符外也不检查CtrlC组合键是否被按下。,2. 0AH号功能从键盘输入一个字符串 该功能要求在调用前,先在数据段中建立一个缓冲区,缓冲区的第一个字节用以存放缓冲区能输入的最大字符数(1255个),该值由用户预先设定, 第二个字节用以存放本次调用该功能时实际输入的字符个数(不包括回车键),并由DOS自动填入。用户真
3、正输入的字符串从第三个字节开始存放,直到输入回车键为止, 而且回车键(0DH)是在字符串的最后面,也存入其中。因此,缓冲区的最大长度应是实际输入的字符个数(不包括回车键)加1。实际输入时,若输入的字符个数超过缓冲区的最大长度,则后面输入的字符被忽略,且响铃,直至输入一个回车键才结束。若输入的字符个数小于缓冲区的最大长度,则可用回车键结束本次输入。实际输入的字符个数(不包括回车键)仍由DOS自动填入第二字节。输入的字符串及回车键仍存放在从第三个字节开始的缓冲区内。另外,0AH功能要求将入口参数DS:DX的值分别指向缓冲区段基址和段内偏移地址。,使用0A功能可输入字符串,输入的数字型字符串也作为字
4、符串对待,若需要的是数字,则应在程序中再加以处理。例如要求输入131(十进制数),该功能输入的是“131”,即131的ASCII码。要得到数131,应分别将每个字符的ASCII码减去30H,然后百位乘100加十位乘10,然后再加个位,才能得到131这个数。,3. 号功能单字符的显示输出 该功能将单个字符在显示器上输出,要求将要显示的字符预先装入DL寄存器(可用字符形式或ASCII码形式)。 调用格式为: MOV DL, X ; X表示任何一个要显示的字符 MOV AH, 2 INT 21H 或为: MOV DL, X ; X表示要显示字符的ASCII码 MOV AH, 2 INT 21H,4.
5、 9号功能字符串的显示输出 该功能将存放在数据区中以“”字符为结束标记的字符串在屏幕上显示输出。调用该功能前先要将显示的字符串存放在数据区,将入口参数,字符串首地址的段基址和段内偏移地址要分别装入DS和DX寄存器中。 若想将字符串分行显示, 则也可以插入回车和换行(0DH, 0AH)码。,9号功能除可以显示提示信息外,还可以显示计算结果, 但计算结果须转换成ASCII码, 存放在数据区内,最后加上“”。 例如, 要显示运算结果(123)10,应将每位数加30H后依次存放在DISCHA开始的内存单元中,即DISCHA DB 31H, 32H, 33H, 。然后按前述调用格式编写程序,当程序执行号
6、功能调用后,屏幕上就会显示123。,5. 5号功能单个字符的打印输出 该功能将DL寄存器中的字符(或ASCII码)送到打印机, 打印输出。 调用格式为: MOV DL, X MOV AH, 5 INT 21H 或为: MOV DL, 字符X的ASCII码 MOV AH, 5 INT 21H,6 4CH号功能返回DOS 该功能结束程序运行, 返回DOS系统。这些内容在上一章5.5.1节中已作介绍。 调用格式为: MOV AH, 4CH INT 21H,6.1.2 DOS(INT 21H)的磁盘文件操作功能调用,1 文件代号 用文件代号方式存取磁盘文件,要用到文件代号。文件代号对用户来说就是用一个
7、ASCIZ串(以0结束的字符串),指定文件的路径名和一个全0的字节。 其中文件路径名可包括磁盘驱动器、目录路径和文件名。 一旦这个信息通过打开文件和建立文件的功能调用, 系统就自动对该文件赋予一个16位的文件代号, 以后系统就会用这个文件代号查找相应的文件, 进行读、 写操作。 ASCIZ的例子如下: FILENAM DB A: TEST.DAT, 0,2 文件操作与功能调用 (1) 建立文件。 要写一个新文件或重写一个旧文件,先要建立一个文件, 建立文件操作的功能调用,主要完成文件代号的获取和赋予文件的属性(读/写、 只读、 隐含)。 建立文件由INT 21H的3CH功能调用完成。 格式为:
8、 MOV AH, 3CH MOV CX, 文件属性 ;(0为读/写, 1为只读,2为隐含) LEA DX, ASCIZ串的地址 ;目录路径名缓冲区的偏移地址送DX INT 21H,JC ERR ; 调用失败转出错处理 MOV FILCODE, AX ; 调用成功将文件代号存放到FILCODE单元 若本次调用成功, 则CF=0, 文件代号在AX中。 若本次调用失败, 则CF=1, 错误代码在AX中, 代码含义有: AX=2, 文件未找到; AX=3, 路径未找到; AX=4, 文件打开太多; AX=5, 不能存取。,(2) 打开文件。 读文件前,先要打开文件。打开文件操作的功能主要是取得文件代号
9、, 检查文件名是否合法、 有效。 打开文件由INT 21H的3DH功能调用完成。 其格式为: MOV AH, 3DH MOV AL, 访问属性; (0为读打开文件, 1为写打开文件, 2为读写打开文件) LEA DX, ASCIZ串的地址 INT 21H JC ERR ; 调用失败转出错处理,MOV FILCODE, AX ; 调用成功将文件代号存放到FILCODE单元 若文件打开成功, 则CF=0, 文件代号在AX中。 若文件打开失败, 则CF=1, 错误代码在AX中, 代码含义有: AX=2, 文件未找到; AX=3, 路径未找到; AX=4, 文件打开太多; AX=5, 不能读写; AX
10、=12, 调用时AL寄存器的值设置错误。,(3) 关闭文件。 写文件操作完成后, 要关闭文件。关闭文件的目的主要是确保DOS将文件写入磁盘。 文件关闭时自动修改目录和文件分配表FAT(File Assignation Table)。 同样读文件结束后也要关闭文件,以减少打开的文件数。这是因为DOS对同时打开的文件数有限制。,(4) 读文件。 打开文件若成功, 即可获得文件代号, 若要读文件可以通过读文件的功能调用, 则按指定的字节数从盘中将文件读出, 送入指定的内存数据缓冲区中。 读文件由INT 21H的3FH功能调用完成。 其格式为: MOV AH, 3FH MOV BX, 文件代号 MOV
11、 CX, 读出字节数 LEA DX, INBUF ; INBUF为内存数据缓冲区的偏移地址 INT 21H,(5) 写文件。 建立文件操作成功后,即可获得文件代号。若要写文件, 可以通过写文件的功能调用,按指定的字节数从内存的数据缓冲区读出写入文件中。 写文件由INT 21H的40H功能调用完成。 其格式为: MOV AH, 40H MOV BX, 文件代号 MOV CX, 内存数据缓冲区中的字节数 LEA DX, 内存数据缓冲区的偏移地址 INT 21H,(6) 移动读写指针。从前述文件操作可知,使用文件代号读写文件是以字节为单位进行读写。 每次读或写的字节数可以任意指定,但总要受到内存数据
12、缓冲区大小的限制,当文件较大时,要分成若干次读或写才能完成整个文件的操作。 操作系统对文件中每个成分的位置由一个称为读写指针的变量指示, 用户可利用它确定文件应从什么位置读出, 或应写入文件的什么位置。,若读写指针移动成功,AX和DX是移动后的指针值,AX的内容是低位字, DX的内容是高位字。 若读写指针移动失败, CF=1, AX为错误代码, 代码含义有: AX=1, 移动方式值非法; AX=6, 非法文件代号。,3 读写文件的举例 例 6.1 将数据段中OUTBUF数据缓冲区中的1KB数据存盘, 文件名为: A: TEST.DAT。 本例要求编制一个程序,通过写文件的操作将1KB的数据写入
13、A驱动器的磁盘上。按文件操作步骤, 整个程序应由建立文件程序段、 写文件程序段和关闭文件程序段组成。 DATA SEGMENT FILNAM DB A: TEST.DAT, 0 FILCODE DW ? OUTBUF DB 1024 DUP (? ),ERRMES1 DB CREATE FILE ERROR $ ERRMES2 DB WRITE FILE ERROR $ ERRMES3 DB THE SPACE IS NO ENOUGH $ DATA ENDS STACKS SEGMENT PARA STACK DB 500 DUP (0) STACKS ENDS CODE SEGMENT A
14、SSUME CS: CODE, SS: STACKS, DS: DATA START: MOV AX, DATA MOV DS, AX,MOV AH, 3CH MOV CX, 0 LEA DX, FILNAM INT 21H JNC NEXT1 ; 文件建立成功 LEA DX, ERRMES1 ; 文件建立失败 CALL DISP ; DISP为显示子程序 JMP EXIT NEXT1: MOV FILCODE, AX ; 保存文件代号 MOV AH, 40H MOV BX, FILCODE ; 文件代号存入BX MOV CX, 1024,PUSH CX LEA DX, OUTBUF INT
15、21H JNC NEXT2 ; 写文件成功 LEA DX, ERRMES2 ; 写文件错 CALL DISP JMP EXIT NEXT2: POP CX CMP AX, CX JE NEXT3 ; 实际写入数与指定字节数相同 LEA DX, ERRMES3 ; 盘空间不够, 没有全部写入指定的数据 CALL DISP,NEXT3: MOV AH, 3EH ; 关闭文件 MOV BX, FILCODE INT 21H EXIT: MOV AH, 4CH INT 21H CODE ENDS DISP PROC NEAR ; 显示错误信息子程序 MOV AH, 09H INT 21H RET DISP ENDP END START,例 6.2 读出A驱动器中文件名为TEST.TXT的ASCII文本文件的内容(文件长度为512字节)并在屏幕上显示。 本例要求编制一个程序, 通过读文件操作将盘上512个字符读出,并存入内存数据缓冲区中,然后分别将它们显示出来。 整个程序应由打开文件的程序段、读文件的程序段、关闭文件的程序段和显示读出字符的程序段组成。 程序如下:,DATA SEGMENT FILNAM DB A: TEST.TXT, 0 F