1、1 1汇编语言程序设计汇编语言程序设计汇编语言程序设计汇编语言程序设计简明教程简明教程简明教程简明教程2 2第六章第六章 字符串与文件处理字符串与文件处理 6.1 6.1 串处理指令串处理指令 6.2 6.2 文件的建立和打开文件的建立和打开 6.3 6.3 文件读写文件读写 6.4 6.4 设备文件设备文件 习题六习题六3 3字符串字符串:计算机中常常用到字符串,如变量名、文件名等都是计算机中常常用到字符串,如变量名、文件名等都是字符串,每个字符的编码占用一个字节,连续地存存贮在字符串,每个字符的编码占用一个字节,连续地存存贮在内存储器中。内存储器中。文件文件:文件是存放在外存储器上的程序或
2、数据。文件是存放在外存储器上的程序或数据。4 46.1 6.1 串处理指令串处理指令 6.1.1 6.1.1 与无条件重复前缀配合使用的串指令与无条件重复前缀配合使用的串指令 6.1.2 6.1.2 与有条件重复前缀配合使用的指令与有条件重复前缀配合使用的指令 5 5串操作指令的共同特点串操作指令的共同特点:源源操操作作数数由由DS:SI提提供供(有有时时也也可可以以由由AL、AX、EAX提提供)供)目的操作数由目的操作数由ES:DI提供提供每每执执行行一一次次串串操操作作,自自动动修修改改SI和和(或或)DI,使使其其指指向向下下一一个字节、字或双字个字节、字或双字方向标志方向标志DF控制对
3、控制对SI、DI递增或是递减递增或是递减指令指令STD将将DF置置1,指令,指令CLD将将DF清清06 61.MOVS 1.MOVS 字符串传送指令字符串传送指令格式:格式:MOVSB/MOVSW/MOVSD执行的操作执行的操作:(1 1)目的操作数单元)目的操作数单元源操作数,源操作数,ES:DIDS:SI ES:DIDS:SI(2 2)修改修改SISI和和DIDI值值6.1.1 6.1.1 与无条件重复前缀与无条件重复前缀REPREP配合使用的指令配合使用的指令7 72.REP串重复操作前缀串重复操作前缀格式:格式:REP串操作指令串操作指令执行的操作执行的操作:重复执行串操作指令,直到:
4、重复执行串操作指令,直到CX的值为零的值为零 如果(如果(CXCX)0 0:(1 1)()(CX CX)()(CX CX)1 1 (2 2)执行串指令执行串指令 (3 3)转向()转向(1 1)如果(如果(CXCX)=0=0,结束本指令操作结束本指令操作8 8例例6-1把长度为把长度为100的字符串的字符串str1复制到复制到str2开始的存储单元中开始的存储单元中假设已经执行如下指令,装载了假设已经执行如下指令,装载了DS:SI和和ES:DI。MOV AX,SEGstr1;源数据的段地址送入源数据的段地址送入DSMOV DS,AXLEASI,str1;源数据的起始偏移地址送入源数据的起始偏移
5、地址送入SIMOV AX,SEGstr2;目的数据的段地址送入目的数据的段地址送入ESMOV ES,AXLEADI,str2;目的数据的起始偏移地址送入目的数据的起始偏移地址送入DI9 9(1)用循环控制方法编写的程序)用循环控制方法编写的程序MOV CX,100;字符串长度送入字符串长度送入CXAGAIN:MOV AL,SI;从源数据区取出一个字节从源数据区取出一个字节MOV ES:DI,AL;存入目的数据区存入目的数据区INCSI;修改源数据区指针修改源数据区指针INCDI;修改目的数据区指针修改目的数据区指针LOOP AGAIN;重复上面的操作重复上面的操作100次次1010(2)用字符
6、串传送指令编写的程序)用字符串传送指令编写的程序MOV CX,100;字符串长度送入字符串长度送入CXAGAIN:MOVSB;从源数据传送一个字节到目的数据区从源数据传送一个字节到目的数据区LOOP AGAIN;重复上面的操作重复上面的操作100次次(3)用带重复前缀的字符串传送指令编写的程序)用带重复前缀的字符串传送指令编写的程序CLD;方向标志方向标志DF清清0MOV CX,100;字符串长度送人字符串长度送人CXREPMOVSB;执行执行100次次MOVSB指令指令11113.STOS STOS 存字符串指令存字符串指令格式:格式:STOSB/STOSW/STOSD执行的操作执行的操作:
7、(1 1)目的存储单元目的存储单元累加器累加器字节操作:字节操作:ES:DIES:DI(ALAL)字操作:字操作:ES:DIES:DI(AXAX)双字操作:双字操作:ES:DIES:DI(EAXEAX)(2 2)修改修改DIDI值值12124.LODS LODS 取字符串指令取字符串指令格式:格式:LODSB/LODSW/LODSD执行的操作执行的操作:(1 1)累加器)累加器源存储单元源存储单元字节操作:(字节操作:(ALAL)DS:SI DS:SI 字操作:字操作:(AXAX)DS:SI DS:SI 双字操作:(双字操作:(EAXEAX)DS:SI DS:SI(2 2)修改修改SISI值值
8、13131.CMPS 1.CMPS 串比较指令串比较指令格式:格式:CMPSB/CMPSW/CMPSD执行的操作执行的操作:(1 1)源操作数目的操作数源操作数目的操作数即:(即:(DS:SIDS:SI)()(ES:DIES:DI),),不保存减法得到的差,但产生新的状态标志不保存减法得到的差,但产生新的状态标志(2 2)修改)修改SISI和和DIDI值值6.1.2 6.1.2 与有条件重复前缀配合使用的指令与有条件重复前缀配合使用的指令14142.REPZREPE当为零相等时重复操作前缀当为零相等时重复操作前缀格式:格式:REPZ/REPE串指令串指令执行的操作执行的操作:如如ZFZF1 1
9、且(且(CXCX)0 0,重复执行串指令重复执行串指令(1)如如ZFZF1 1且(且(CXCX)0 0,则:则:(a)执行串操作指令执行串操作指令(b)()(CX)()(CX)1 (c)返回(返回(1)(2)ZFZF0 0或或(CX)CX)0 0,执执行行“REPE/REPZ REPE/REPZ 串串指指令令”的的后后续续指指令令 1515例例6-2两个字符串两个字符串STRING1、STRING2长度相同,编写一个程序,长度相同,编写一个程序,比较它们是否相同。比较它们是否相同。(1)用循环控制方法编写的程序段)用循环控制方法编写的程序段DATASEGMENTSTRING1DBALLSTUD
10、ENTSSTRING2DBALLSTODENTSNEQUSTRING2STRING1MESS1DB0DH,0AH,Yes,Stringsarematched.$MESS2DB0DH,0AH,No,Stringsarenotmatched.$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA1616START:MOVAX,DATA MOVDS,AX MOVES,AX LEASI,STRING1 LEADI,STRING2 MOV CX,NAGA:MOVAL,SI CMPAL,ES:DI JNENO INCSI INCDI LOOP AGA JMPYES1717NO:
11、LEADX,MESS2 JMPDISPYES:LEADX,MESS1DISP:MOV AH,09H INT21H MOV AX,4C00H INT21HCODE ENDS ENDSTART1818例例6-2:(2)用带重复前缀的字符串比较指令编写的程序:)用带重复前缀的字符串比较指令编写的程序:;装载;装载DS:SI、ES:DI、CX的程序同上的程序同上REPZ CMPSBJNENOYES:LEADX,MESS1JMPDISPNO:LEADX,MESS2DISP:19193.3.REPNZREPNZREPNE REPNE 当不为零不相等时重复操作前缀当不为零不相等时重复操作前缀 该前缀与该前缀
12、与REPZREPE对标志位对标志位ZF的判别条件刚好相反的判别条件刚好相反格式:格式:REPNZ/REPNE串指令串指令执行的操作:如果执行的操作:如果ZF=0且(且(CX)0,重复串操作重复串操作如如ZFZF0 0且(且(CXCX)00,则:则:(1 1)执行串操作指令)执行串操作指令 (2 2)()(CXCX)()(CXCX)1 1 ZF ZF1 1或(或(CXCX)0 0,停止执行本指令,执行下一条指令停止执行本指令,执行下一条指令20204.4.SCAS SCAS 串扫描指令串扫描指令 格式:格式:SCASB/SCASW/SCASD执行的操作执行的操作:(1 1)累加器目的操作数)累加
13、器目的操作数 字节操作:(字节操作:(ALAL)(ES:DIES:DI)字操作:字操作:(AXAX)(ES:DIES:DI)双字操作:(双字操作:(EAXEAX)()(ES:DIES:DI)(2 2)修改修改DIDI值值2121例例6-3字符串由字符串由ASCII代码代码0表示结束,它的首地址由表示结束,它的首地址由ES:DI指出,编指出,编制函数制函数LEN,求该字符串的长度,置入求该字符串的长度,置入AX返回。返回。;函数;函数“LEN”;功能:求一个字符串的长度功能:求一个字符串的长度;入口:字符串首地址在;入口:字符串首地址在ES:DI中,字符串以中,字符串以ASC码码0结束结束;出口
14、:字符串的长度在;出口:字符串的长度在AX中中;影响寄存器:;影响寄存器:AX,FLAGS;说明:假设字符串长度不超过说明:假设字符串长度不超过60000字符字符.MODELSMALLPUBLICLEN.CODE2222LENPROC FARPUSHCXPUSHDICLDXORAX,AXMOVCX,60000REPNESCASBMOVAX,60000SUBCXDEC AXPOPDIPOPCXRETLENENDPEND23236.2 6.2 文件的建立和打开文件的建立和打开 6.2.1 6.2.1 文件文件6.2.2 6.2.2 文件的建立、打开和关闭文件的建立、打开和关闭 24241.1.路径
15、名和路径名和ASCIZASCIZ串串文件路径名指出该文件在辅助存储器上的位置,包括磁盘驱文件路径名指出该文件在辅助存储器上的位置,包括磁盘驱动器号、目录路径和文件名动器号、目录路径和文件名路径名和一个全路径名和一个全0字节构成的字符串称为字节构成的字符串称为“ASCIZ”串串2.2.文件代号文件代号操操作作系系统统为为每每个个处处于于“活活动动”状状态态的的文文件件分分配配一一个个用用16位位二进制表示的二进制表示的“文件代号文件代号”(Handle)6.2.1 6.2.1 文件文件 25253.文件属性文件属性每个文件有一个记录该文件特性的字节,称为文件属性。每个文件有一个记录该文件特性的字
16、节,称为文件属性。该字节各位所代表的含义:该字节各位所代表的含义:D0只读文件,该文件不能进行写操作只读文件,该文件不能进行写操作D1隐藏文件,用隐藏文件,用DIR查不到该文件查不到该文件D2系统文件,用系统文件,用DIR查不到该文件查不到该文件D3软盘的卷标号,该文件内容为磁盘的软盘的卷标号,该文件内容为磁盘的“卷标卷标”D4子目录,该文件内容为下一级文件的子目录,该文件内容为下一级文件的“目录目录”D5归档位,已写入并关闭了的文件(硬盘用)归档位,已写入并关闭了的文件(硬盘用)26264.4.文件代号方式的文件代号方式的DOSDOS功能调用功能调用磁盘文件的处理使用磁盘文件的处理使用DOS
17、或或BIOS的功能调用来实现。的功能调用来实现。DOS中中断断服服务务(INT21H)能能实实现现高高级级的的文文件件操操作作,只只要要给给出文件名就能读写文件。出文件名就能读写文件。表表6.1给出了用文件代号方式实现文件管理的给出了用文件代号方式实现文件管理的DOS功能调用功能调用27275.5.文件操作返回代码文件操作返回代码对磁盘文件进行操作,如果成功,返回时对磁盘文件进行操作,如果成功,返回时CF置为置为0。如果操。如果操作不成功,返回时作不成功,返回时CF被置成被置成1。这时,。这时,AX中包含了错误代码,中包含了错误代码,用来指明对磁盘文件操作失败的原因用来指明对磁盘文件操作失败的
18、原因表表6.2列出了列出了0136的错误代码及与之对应的错误信息的错误代码及与之对应的错误信息6.6.数据传送区数据传送区在文件处理过程中,从磁盘读出的数据或要写入磁盘的数在文件处理过程中,从磁盘读出的数据或要写入磁盘的数据,都要存放在一个指定的内存区域,这个区域称为数据传据,都要存放在一个指定的内存区域,这个区域称为数据传送区(送区(DTA),),或者或者“磁盘缓冲区磁盘缓冲区”。2828功能号功能号(AH)功功能能调用参数调用参数返回参数返回参数3CH建立文件建立文件DS=ASCIZ串段基址串段基址DX=ASCIZ串偏移地串偏移地址址CX=文件属性文件属性CF=0操作成功:操作成功:AX=
19、文件代号文件代号CF=l操作出错:操作出错:AX错误代码错误代码3DH打开文件打开文件DS=ASCIZ串段基址串段基址DX=ASCIZ串串的的偏偏移移地址地址AL=存取代码存取代码CF=0操作成功:操作成功:AX=文件代号文件代号CF=l操作出错:操作出错:AX错误代码错误代码3EH关闭文件关闭文件BX=文件代号文件代号CF=0操作成功操作成功CF=l操作出错:操作出错:AX错误代码错误代码表表6.2文件系统功能调用文件系统功能调用29293FH读读文文件件或或设备设备DS=数据缓冲区段基数据缓冲区段基址址DX=数据缓冲区偏移数据缓冲区偏移地址地址BX=文件代号文件代号CX=读取的字节数读取的
20、字节数CF=0读成功:读成功:AX=实际读入的字节数实际读入的字节数AX=0表示文件结束表示文件结束CF=1读出错:读出错:AX=错误代码错误代码40H写写文文件件或或设备设备DS=数据缓冲区段基数据缓冲区段基址址DX=数据缓冲区偏移数据缓冲区偏移地址地址BX=文件代号文件代号CX=写入的字节数写入的字节数CF=0写成功:写成功:AX=实际写入的字节数实际写入的字节数CF=1写出错:写出错:AX=错误代码错误代码功能号功能号(AH)功功能能调用参数调用参数返回参数返回参数303042H移移动动文文件件指针指针CX=所需字节的偏移所需字节的偏移地址地址(高位高位)DX=所需字节的偏移所需字节的偏
21、移地址地址(低位低位)AL=移动方式码移动方式码BX=文件代号文件代号CF=0操作成功:操作成功:DX:AX=新指针位置新指针位置CF=1操作失败:操作失败:AX=错误代码错误代码43H读读写写文文件件属性属性AL=0读文件属性读文件属性AL=1置文件属性置文件属性CX=新属性新属性DS=ASCIZ串段基址串段基址DX=ASCIZ串偏移地串偏移地址址CF=0操作成功:操作成功:AL=0,CX=属性属性CF=1操作失败:操作失败:AX=错误代码错误代码功能号功能号(AH)功功能能调用参数调用参数返回参数返回参数31311.文件的建立文件的建立对对于于一一个个磁磁盘盘上上不不存存在在的的文文件件,
22、使使用用之之前前首首先先要要“建建立立”这个文件这个文件。注注意意:建建立立文文件件时时,应应确确保保在在同同一一个个目目录录中中该该文文件件不不存存在在,否否则则将将覆覆盖盖原原来来存存在在的的同同名名文文件件,造造成成信信息息的的丢丢失失,除除非非你你用这种方法同时用这种方法同时“删除删除”一个不再需要的老文件。一个不再需要的老文件。6.2.2 6.2.2 文件的建立、打开和关闭文件的建立、打开和关闭 3232DATASEGMENTFILENAMEDBD:STUDENTTEST1.DAT,0HANDLE DW?SUCCESS DB0DH,0AH,ThefilehasbeenCREATED.
23、$FAILDB0DH,0AH,ThefilefailtobeCREATED.$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOV DS,AX例例6-4在在D盘的盘的STUDENT文件夹下建立一个名为文件夹下建立一个名为TEST1.DAT文件,文件,建立成功显示建立成功显示“ThefilehasbeenCREATED.”,将文件代号存放在将文件代号存放在FILENUM字单元,否则显示字单元,否则显示“ThefilefailtobeCREATED.”。3333LEADX,FILENAME;ASCIZ串地址置入串地址置入DS:DXM
24、OV CX,0;文件属性为文件属性为0(普通文件)(普通文件)MOV AH,3CHINT 21H;建立该文件建立该文件JNC SUCCE;CF=0,转,转SUCCELEA DX,FAIL;CF=1,置出错信息地址置出错信息地址JMP QUITSUCCE:MOV HANDLE,AX;保存文件代号保存文件代号LEADX,SUCCESS;取取“成功成功”信息地址信息地址QUIT:MOVAH,09HINT21H;显示成功显示成功/失败信息失败信息MOVAH,4CHINT21HCODE ENDSENDSTART34342.文件的打开文件的打开对对一一个个已已经经存存在在的的磁磁盘盘文文件件进进行行读读、
25、写写操操作作前前,首首先先要要“打打开开”这个文件这个文件。存取代码存取代码:存取代码告诉操作系统打开文件要进行什么样操作。:存取代码告诉操作系统打开文件要进行什么样操作。打开一个文件打开一个文件:AH=3DHDS:DX=ASCIZ串首地址串首地址AL=文件存取代码文件存取代码3535只只读读文文件件只只能能用用代代码码0来来打打开开,如如果果使使用用存存取取代代码码1或或2时时将将报报告告错误。错误。打开一个不存在的文件同样也会报告错误。打开一个不存在的文件同样也会报告错误。常用的文件存取代码:常用的文件存取代码:0:为读而打开文件:为读而打开文件1:为写而打开文件:为写而打开文件2:为读和
26、写打开文件:为读和写打开文件36363.关闭文件关闭文件一一个个文文件件读读写写完完毕毕之之后后,需需要要将将它它关关闭闭,这这个个文文件件从从“活活动状态动状态”回复到回复到“静止静止”状态。状态。关闭文件的操作通过关闭文件的操作通过3EH的的DOS功能调用实现功能调用实现37376.3 6.3 文件文件读写读写6.3.1 6.3.1 文件写文件写6.3.2 6.3.2 文件读文件读 6.3.2 6.3.2 文件指针文件指针38381.1.将一组信息记录写入文件中,用户需要进行如下的操作:将一组信息记录写入文件中,用户需要进行如下的操作:建建立立文文件件:使使用用3CH的的DOS功功能能调调
27、用用建建立立这这个个文文件件,保保存存返回的文件代号。返回的文件代号。写写文文件件:把把需需要要写写入入磁磁盘盘文文件件的的内内容容写写入入“磁磁盘盘缓缓冲冲区区”,然后使用,然后使用40H的的DOS功能调用把这些信息写入文件。功能调用把这些信息写入文件。关闭文件:使用关闭文件:使用3EH的的DOS功能调用关闭这个文件。功能调用关闭这个文件。6.3.1 6.3.1 文件写文件写 3939例例6-5下面的程序首先要求输入一个磁盘文件名,随后把键盘输入的下面的程序首先要求输入一个磁盘文件名,随后把键盘输入的文字存放到这个磁盘文件中。文字存放到这个磁盘文件中。DATASEGMENTMESS0DB0D
28、H,0AH,“InputFileNamePlease:$”BUFFERDB60,?FILENAMEDB60DUP(?)HANDLEDW?DTA DB?PROMPTDB0DH,0AH,InputTextPlease:$SUCCESSDB0DH,0AH,WriteSuccess$FAIL1DB0DH,0AH,FailtoCreate$FAIL2DB0DH,0AH,FailtoWrite$DATAENDS4040CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADX,MESS0;为输入文件名输出提示信息为输入文件名输出提示信息MOV
29、AH,09HINT21HLEADX,BUFFER;输入文件名输入文件名MOVAH,0AHINT21HMOVBL,BUFFER+1MOVBH,0MOVFILENAMEBX,0;把回车字符修改为把回车字符修改为00H,形成形成ASCIZ串串4141LEADX,FILENAME;ASCIZ串首地址装入串首地址装入DS:DXMOV AH,3CH;建立文件的功能代号建立文件的功能代号MOV CX,00H;文件属性(普通文件)文件属性(普通文件)INT21H;建立文件建立文件JCERR1;建立出错,转建立出错,转ERR1MOV HANDLE,AX;保存文件代号保存文件代号LEA DX,PROMPTMOV
30、AH,09HINT21H;显示提示信息,要求用户键盘输入显示提示信息,要求用户键盘输入LEA DX,DTA;DTA首地址装入首地址装入DS:DXMOV BX,HANDLE;文件代号装入文件代号装入BX4242AGAIN:MOV AH,01HINT21HMOV DTA,AL;键盘上输入一个字符,送入键盘上输入一个字符,送入DTAAGN1:MOV AH,40HMOVCX,1INT21H;把这个字符写入磁盘文件把这个字符写入磁盘文件JCERR2;写文件错误,转写文件错误,转ERR2CMPDTA,0DH;刚输入字符是回车?刚输入字符是回车?JNEAGN2PUSH DX;保护保护DX的值的值MOV AH
31、,2MOV DL,0AH4343 INT21H;回车字符后面输出换行回车字符后面输出换行POPDX;恢复恢复DX的值的值 MOVDTA,0AH;换行字符填入换行字符填入DTA JMPAGN1;换行字符补写到磁盘文件换行字符补写到磁盘文件AGN2:CMPDTA,1AH;刚输入字符是刚输入字符是EOF?JNEAGAIN;不是不是EOF,继续键盘输入继续键盘输入LEADX,SUCCESSCALLDISP;显示写文件成功信息显示写文件成功信息CLOSE:MOVAH,3EH MOVBX,HANDLEINT21H;关闭文件关闭文件 JMPEXIT4444ERR1:LEADX,FAIL1CALLDISP;显
32、示打开错误信息显示打开错误信息 JMPEXIT;打开不成功打开不成功,无需关闭,转无需关闭,转EXIT结束结束ERR2:LEADX,FAIL2;显示写文件错信息显示写文件错信息CALLDISPJMPCLOSE;文件已打开,需要关闭文件已打开,需要关闭EXIT:MOVAH,4CHINT21H;返回返回OSDISP:MOVAH,09HINT21HRETCODE ENDSENDSTART45451.1.从文件中读出信息,需要以下操作:从文件中读出信息,需要以下操作:打打开开文文件件:使使用用3DH的的DOS功功能能调调用用打打开开这这个个文文件件,保保存返回的文件代号存返回的文件代号读读文文件件:把
33、把“磁磁盘盘缓缓冲冲区区”首首地地址址装装入入DS:DX,文文件件代代号号装装入入BX,读读取取字字节节数数装装入入CX,使使用用3FH的的DOS功功能能调调用用把文件信息读到磁盘缓冲区内把文件信息读到磁盘缓冲区内 关闭文件:使用关闭文件:使用3EH的的DOS功能调用关闭这个文件功能调用关闭这个文件6.3.2 6.3.2 文件读文件读4646例例6-6打开磁盘上的一个文本文件,将它的内容显示在显示器上打开磁盘上的一个文本文件,将它的内容显示在显示器上(类似于(类似于DOS命令命令TYPE)。)。;EX606.ASMDATASEGMENTHANDLEDW?DTADB?PROMPT0DB0DH,0
34、AH,NoFilenameinCommandLine.$PROMPT1DB0DH,0AH,OpenFileError.$PROMPT2DB0DH,0AH,ReadFileError.$DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA4747START:CLDMOVDI,0081H;命令行参数区在命令行参数区在PSP中的偏移量中的偏移量CMPBYTEPTRDI-1,0;有参数字符?有参数字符?JEERR0;参数为参数为“空空”,报告错误,报告错误MOVAL,0DHMOVCX,40REPNESCASB;测试参数长度测试参数长度JNZERR0;长度超过长度超过40字符
35、,报告错误字符,报告错误MOVBYTEPTRDI-1,0;将回车字符修改为将回车字符修改为0,形成,形成ASCIZ串串MOVDX,0081H;DS:DX指向指向ASCIZ串串MOVAH,3DHMOVAL,0;打开方式打开方式0,为读打开,为读打开INT21H;打开这个文件打开这个文件JCERR1;打开失败,转打开失败,转ERR14848MOVCX,DATAMOVDS,CX;装载装载DSMOVHANDLE,AX;保存文件代号保存文件代号AGAIN:LEADX,DTA;DS:DX指向指向DTAMOVBX,HANDLE;BX=文件代号文件代号MOVCX,1;CX=读取字节数读取字节数MOVAH,3F
36、HINT21H;从文件中读从文件中读1字节,存入字节,存入DTAJCERR2;读错,转读错,转ERR2CMPAX,0;读出字节数为读出字节数为0?JECLOSE;读出字节数为读出字节数为0,转,转CLOSECMPDTA,1AH;读出内容是读出内容是EOF?JECLOSE;读出内容是读出内容是EOF,转,转CLOSEMOVDL,DTAMOVAH,2INT21H;将读出字符送显示器输出将读出字符送显示器输出JMPAGAIN;重复上述过程重复上述过程4949ERR0:MOV AX,DATA;尚未装载尚未装载DSMOV DS,AX;为显示出错信息装载为显示出错信息装载DSLEADX,PROMPT0CA
37、LLDISP;显显示示“命命令令行行无无参参数数”错错误误JMPEXITERR1:MOVAX,DATA;尚未装载尚未装载DSMOVDS,AX;为显示出错信息装载为显示出错信息装载DSLEADX,PROMPT1CALLDISP;显示显示“文件打开错误文件打开错误”JMPEXITERR2:LEADX,PROMPT2CALLDISP;显示显示“文件读错误文件读错误”5050CLOSE:MOVAH,3EHMOVBX,HANDLEINT21H;关闭文件关闭文件EXIT:MOVAH,4CHINT21H;返回返回OSDISP:MOVAH,09HINT21HRETCODE ENDSENDSTART51511.
38、1.文件的指针文件的指针“文文件件指指针针”变变量量,记记录录着着应应从从文文件件的的什什么么地地方方读读出出数数据据,或者,应向文件的什么地方写入数据。或者,应向文件的什么地方写入数据。如如果果需需要要读读、写写文文件件中中某某一一个个指指定定位位置置开开始始的的内内容容,则则首首先要使文件指针指向该位置。先要使文件指针指向该位置。操作系统提供了移动文件指针的功能(功能号操作系统提供了移动文件指针的功能(功能号42H)。)。6.3.3 6.3.3 文件指针文件指针5252入口入口:BX=文件代号。文件代号。CX:DX=双字长的偏移值,带符号整数,正数或负数。双字长的偏移值,带符号整数,正数或
39、负数。AL=指定指针调整的三种方式之一:指定指针调整的三种方式之一:0绝对移动方式,以文件开头位置加绝对移动方式,以文件开头位置加CX:DX偏移值来移动指针偏移值来移动指针1相对移动方式,以当前指针位置加相对移动方式,以当前指针位置加CX:DX偏移值来移动指针偏移值来移动指针2绝对倒移方式,以文件尾的位置加绝对倒移方式,以文件尾的位置加CX:DX偏移值来移动指针偏移值来移动指针出口出口:如果成功(如果成功(CF=0),),CX:DX中为移动后的新指针的值。中为移动后的新指针的值。移动文件指针操作(功能号移动文件指针操作(功能号42H)53532.2.文件追加文件追加 :在已有的文件后面添加新的
40、记录:在已有的文件后面添加新的记录 1)以写方式打开这个文件(以写方式打开这个文件(AL=1)2)取取CX:DX=00:00,使使用用AL2的的绝绝对对倒倒移移方方式式移移动动指指针针,使使文文件指针指向文件尾部;件指针指向文件尾部;3)把追加内容存入磁盘缓冲区;把追加内容存入磁盘缓冲区;4)使用使用AH=40H的系统功能调用,把磁盘缓冲区内容写入文件;的系统功能调用,把磁盘缓冲区内容写入文件;重复步骤重复步骤3),),4),直到所有内容写入文件;),直到所有内容写入文件;1)关闭这个文件。关闭这个文件。5454例例6-7把文本文件把文本文件D:MYDOC2.TXT拼接在文本文件拼接在文本文件
41、D:MYDOC1.TXT的后面,实现文件的的后面,实现文件的“连接连接”。DATA SEGMENTFILENAME1DBD:MYDOC1.TXT,0FILENAME2DBD:MYDOC2.TXT,0DTADB256DUP(?);磁盘缓冲区磁盘缓冲区HANDLE1DW?HANDLE2DW?DONEDB0;文件文件2读操作完成标志读操作完成标志FAIL1DB0DH,0AH,OpenFileError.$FAIL2DB0DH,0AH,MoveFilePointerError.$FAIL3DB0DH,0AH,ReadFileError.$FAIL4DB0DH,0AH,WriteFileError.$D
42、ATAENDS5555CODE SEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDONE,0;置置“未完成未完成”标志标志LEADX,FILENAME1;为为“写写”打开文件打开文件1MOV AL,01HMOV AH,3DHINT21HJCERR11;打开不成功,转打开不成功,转ERR11MOVHANDLE1,AX;保存文件代号保存文件代号5656LEADX,FILENAME2;为为“读读”打开文件打开文件2MOVAL,0MOVAH,3DHINT21HJCERR12;打开不成功,转打开不成功,转ERR12MOVHANDLE2,AX;
43、保存文件代号保存文件代号MOVAH,42H;把文件把文件1指针移动到文件尾部指针移动到文件尾部MOVAL,02MOVDX,0MOVCX,0MOVBX,HANDLE1INT21HJCERR2;移动指针不成功,转移动指针不成功,转ERR25757AGAIN:MOVAH,3FH;读文件读文件2LEADX,DTAMOVBX,HANDLE2MOVCX,256INT21HJCERR3;读文件失败,转读文件失败,转ERR3PUSHAXCMPAX,0JNEAGA1MOVDONE,1JMPFINISH;文件结束,转文件结束,转FINISHAGA1:CMPAX,256JECONTMOVDONE,1;文件结束,置完
44、成标志文件结束,置完成标志5858CONT:MOVAH,40H;写文件写文件1LEADX,DTAMOVBX,HANDLE1POPCXINT21HJCERR4;写文件失败,转写文件失败,转ERR4CMPDONE,0JEAGAINFINISH:MOV AH,3EH;关闭文件关闭文件2MOVBX,HANDLE2INT21HFINISH1:MOV AH,3EHMOVBX,HANDLE1;关闭文件关闭文件1INT21HJMPEXIT5959ERR11:LEADX,FAIL1;打开文件打开文件1失败,显示信息失败,显示信息MOVAH,09H;然后返回操作系统然后返回操作系统INT21HJMPEXITERR
45、12:LEADX,FAIL1;打开文件打开文件2失败,显示信息失败,显示信息MOVAH,09H;转向转向FINISH1,关闭文件关闭文件1INT21HJMPFINISH1ERR2:LEADX,FAIL2;移动指针失败,显示信息移动指针失败,显示信息JMPDISPERR3:LEADX,FAIL3;读文件失败,显示信息读文件失败,显示信息JMPDISPERR4:LEADX,FAIL4;写文件失败,显示信息写文件失败,显示信息6060DISP:MOVAH,09H;显示出错信息显示出错信息INT21HJMPFINISH;转转FINISH,关闭文件关闭文件EXIT:MOV AX,4C00HINT21HC
46、ODE ENDSENDSTART6161假假设设文文件件“D:MYDOC1.TXT”和和“D:MYDOC2.TXT”已已经经存在,先后执行命令:存在,先后执行命令:D:TASM5DIRD:MYDOC?.TXTD:TASM5EX607D:TASM5DIRD:MYDOC?.TXTD:TASM5TYPED:MYDOC1.TXT将会发现,执行程序将会发现,执行程序“EX607.EXE”之后,文件之后,文件“MYDOC1.TXT”的长度是执行之前文件的长度是执行之前文件“D:MYDOC1.TXT”和和“D:MYDOC2.TXT”长度之和,而且它的内容也是原来这两个长度之和,而且它的内容也是原来这两个文件
47、内容的文件内容的“连接连接”。62623.3.文件随机读写文件随机读写 “顺顺序序读读”、“顺顺序序写写”:对对文文件件的的读读写写都都是是从从文文件件头头部部开始顺序进行。开始顺序进行。记记录录:许许多多磁磁盘盘文文件件内内部部由由若若干干“组组”信信息息组组合合而而成成的的,这个信息这个信息“组组”称为称为“记录记录(Record)”。随随机机读读写写文文件件:文文件件的的读读写写以以“记记录录”为为单单位位进进行行,可可以以按按照照记记录录的的自自然然顺顺序序进进行行,也也可可以以任任意意选选择择其其中中的的一一个个或或几几个记录进行。个记录进行。6363(1)建立随机读写文件建立随机读
48、写文件用用AH=3CH功能建立文件;功能建立文件;将磁盘缓冲区将磁盘缓冲区“清空清空”;用顺序写方式重复写入文件,用顺序写方式重复写入文件,得到一个由若干个等长得到一个由若干个等长“空空”记录组成的随机读写文件。记录组成的随机读写文件。对对“随机读写文件随机读写文件”进行操作时,磁盘缓冲区大小一般进行操作时,磁盘缓冲区大小一般等于文件内一个记录的长度。等于文件内一个记录的长度。6464(2)随机读文件随机读文件 用用AH=3DH功能打开该文件;功能打开该文件;根据记录号计算出该记录在文件内的位置;根据记录号计算出该记录在文件内的位置;用用AH=42H功能将文件指针指向该记录;功能将文件指针指向
49、该记录;用用AH=3FH功能读出该记录。功能读出该记录。6565 (3 3)随机写文件随机写文件用用AH=3DH功能打开该文件;功能打开该文件;根据记录号计算出该记录在文件内的位置;根据记录号计算出该记录在文件内的位置;用用AH=42H功能将文件指针指向该记录功能将文件指针指向该记录(如果该记录不存在,则仿照建立文件的方法,在该(如果该记录不存在,则仿照建立文件的方法,在该记录前面写入若干个记录前面写入若干个“空空”记录);记录);将该记录内容写入磁盘缓冲区;将该记录内容写入磁盘缓冲区;用用AH=40H功能将新内容写入该记录。功能将新内容写入该记录。6666(4)修改文件内容修改文件内容用用A
50、H=3DH功能打开该文件;功能打开该文件;根据记录号计算出该记录在文件内的位置;根据记录号计算出该记录在文件内的位置;用用AH=42H功能将文件指针指向该记录;功能将文件指针指向该记录;将该记录内容读入磁盘缓冲区;将该记录内容读入磁盘缓冲区;在缓冲区内修改该记录内容;在缓冲区内修改该记录内容;用用AH=42H功能将文件指针重新指向该记录;功能将文件指针重新指向该记录;用用AH=40H功能将修改后内容写入该记录。功能将修改后内容写入该记录。67674.文件修改文件修改(修改前后文件长度发生改变修改前后文件长度发生改变)设被修改的文件由设被修改的文件由A,B,C三段组成,修改三段组成,修改“B”这