汇编语言程序设计,文件操作管理

来源:互联网 发布:2016美容行业数据 编辑:程序博客网 时间:2024/05/29 09:04
汇编语言程序设计
简明教程
第六章 字符串与文件处理 
6.1 串处理指令 
6.2 文件的建立和打开 
6.3 文件读写 
6.4 设备文件 
习题六
字符串:
计算机中常常用到字符串,如变量名,文件名等都是字符串,每个字符的编码占用一个字节,连续地存存贮在内存储器中. 
文件:
文件是存放在外存储器上的程序或数据. 
6.1 串处理指令 
6.1.1 与无条件重复前缀配合使用的串指令 
6.1.2 与有条件重复前缀配合使用的指令 
串操作指令的共同特点:
源操作数由DS:[SI]提供(有时也可以由AL,AX,EAX提供) 
目的操作数由ES:[DI]提供 
每执行一次串操作,自动修改SI和(或)DI,使其指向下一个字节,字或双字 
方向标志DF控制对SI,DI递增或是递减 
指令STD将DF置1,指令CLD将DF清0 
1. MOVS 字符串传送指令
格式:MOVSB / MOVSW / MOVSD
执行的操作: 
(1)目的操作数单元←源操作数,ES:[DI]←DS:[SI] 
(2)修改SI和DI值
6.1.1 与无条件重复前缀REP配合使用的指令
2. REP 串重复操作前缀
格式: REP 串操作指令 
执行的操作:重复执行串操作指令,直到CX的值为零 
如果(CX)≠ 0:
(1)(CX )=(CX )-1
(2)执行串指令
(3)转向(1)
如果(CX)= 0,结束本指令操作
[例6-1] 把长度为100的字符串str1复制到str2开始的存储单元中
假设已经执行如下指令,装载了DS: SI和ES: DI.
MOV AX,SEG str1 ;源数据的段地址送入DS
MOV DS,AX 
LEA SI,str1 ; 源数据的起始偏移地址送入SI
MOV AX,SEG str2 ;目的数据的段地址送入ES
MOV ES,AX 
LEA DI,str2 ; 目的数据的起始偏移地址送入DI
(1)用循环控制方法编写的程序 
MOV CX,100 ;字符串长度送入CX
AGAIN: MOV AL, [SI] ;从源数据区取出一个字节
MOV ES:[DI],AL ;存入目的数据区
INC SI ;修改源数据区指针
INC DI ;修改目的数据区指针
LOOP AGAIN ;重复上面的操作100次 
(2)用字符串传送指令编写的程序
MOV CX,100 ;字符串长度送入CX
AGAIN:MOVSB ;从源数据传送一个字节到目的数据区
LOOP AGAIN ;重复上面的操作100次
(3)用带重复前缀的字符串传送指令编写的程序
CLD ;方向标志DF清0
MOV CX,100 ;字符串长度送人CX
REP MOVSB ;执行100次MOVSB指令
3. STOS 存字符串指令
格式: STOSB/ STOSW/STOSD 
执行的操作:
(1)目的存储单元←累加器
字节操作:ES:[DI]←(AL)
字操作: ES:[DI]←(AX)
双字操作:ES:[DI]←(EAX)
(2)修改DI值
4. LODS 取字符串指令
格式: LODSB/ LODSW/LODSD 
执行的操作:
(1)累加器←源存储单元
字节操作:(AL) ← DS:[SI] 
字操作: (AX) ← DS:[SI] 
双字操作:(EAX)← DS:[SI] 
(2)修改SI值
1. CMPS 串比较指令
格式:CMPSB/CMPSW/CMPSD 
执行的操作: 
(1)源操作数-目的操作数
即:(DS:[SI])-(ES:[DI]),
不保存减法得到的差,但产生新的状态标志
(2)修改SI和DI值
6.1.2 与有条件重复前缀配合使用的指令
2. REPZ/REPE 当为零/相等时重复操作前缀
格式: REPZ / REPE 串指令 
执行的操作:如ZF=1且(CX)≠0,重复执行串指令
(1) 如ZF=1且(CX)≠0,则:
(a) 执行串操作指令
(b)(CX)=(CX)-1
(c) 返回(1)
(2)ZF=0或(CX)=0,执行"REPE/REPZ 串指令"的后续指令 
[例6-2]两个字符串STRING1,STRING2长度相同,编写一个程序,比较它们是否相同.
(1)用循环控制方法编写的程序段
DATA SEGMENT
STRING1 DB 'ALL STUDENTS……'
STRING2 DB 'ALL STODENTS……'
N EQU STRING2-STRING1 
MESS1 DB 0DH, 0AH, 'Yes, Strings are matched. $'
MESS2 DB 0DH, 0AH, 'No, Strings are not matched. $'
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:MOV AX, DATA
MOV DS, AX
MOV ES, AX
LEA SI, STRING1
LEA DI, STRING2
MOV CX, N
AGA: MOV AL, [SI]
CMP AL, ES: [DI]
JNE NO
INC SI
INC DI
LOOP AGA
JMP YES
NO: LEA DX, MESS2
JMP DISP
YES: LEA DX, MESS1
DISP: MOV AH, 09H
INT 21H
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
[例6-2] :(2)用带重复前缀的字符串比较指令编写的程序:
;装载DS: SI,ES: DI,CX的程序同上
……
REPZ CMPSB 
JNE NO
YES: LEA DX, MESS1
JMP DISP
NO: LEA DX,MESS2
DISP: ……
3. REPNZ/REPNE 当不为零/不相等时重复操作前缀 
该前缀与REPZ/REPE对标志位ZF的判别条件刚好相反 
格式: REPNZ / REPNE 串指令 
执行的操作:如果ZF=0且(CX)≠0,重复串操作 
如ZF=0且(CX)≠0,则:
(1)执行串操作指令
(2)(CX)=(CX)-1
ZF=1或(CX)=0,停止执行本指令,执行下一条指令 
4. SCAS 串扫描指令 
格式: SCASB/ SCASW/SCASD 
执行的操作:
(1)累加器-目的操作数
字节操作:(AL) -(ES:[DI]) 
字操作: (AX) -(ES:[DI])
双字操作:(EAX)-(ES:[DI])
(2)修改DI值
[例6-3]字符串由ASCII代码0表示结束,它的首地址由ES: DI指出,编制函数LEN, 求该字符串的长度,置入AX返回.
;函数"LEN" 
;功能:求一个字符串的长度
;入口:字符串首地址在ES: DI中,字符串以ASC码0结束
;出口:字符串的长度在AX中
;影响寄存器:AX,FLAGS 
;说明:假设字符串长度不超过60000字符
. MODEL SMALL
PUBLIC LEN
. CODE
LEN PROC FAR
PUSH CX
PUSH DI
CLD 
XOR AX, AX
MOV CX, 60000
REPNE SCASB
MOV AX, 60000
SUB CX
DEC AX
POP DI
POP CX
RET
LEN ENDP
END 
6.2 文件的建立和打开 
6.2.1 文件
6.2.2 文件的建立,打开和关闭 
1. 路径名和ASCIZ串
文件路径名指出该文件在辅助存储器上的位置,包括磁盘驱动器号,目录路径和文件名
路径名和一个全0字节构成的字符串称为"ASCIZ"串 
2.文件代号
操作系统为每个处于"活动"状态的文件分配一个用16位二进制表示的"文件代号"(Handle)
6.2.1 文件 
3.文件属性
每个文件有一个记录该文件特性的字节,称为文件属性.该字节各位所代表的含义: 
D0——只读文件,该文件不能进行写操作
D1——隐藏文件,用DIR查不到该文件
D2——系统文件,用DIR查不到该文件
D3——软盘的卷标号,该文件内容为磁盘的"卷标"
D4——子目录,该文件内容为下一级文件的"目录"
D5——归档位,已写入并关闭了的文件(硬盘用)
4. 文件代号方式的DOS功能调用
磁盘文件的处理使用DOS或BIOS的功能调用来实现.
DOS中断服务(INT 21H)能实现高级的文件操作,只要给出文件名就能读写文件.
表6.1给出了用文件代号方式实现文件管理的DOS功能调用
5.文件操作返回代码
对磁盘文件进行操作,如果成功,返回时CF置为0.如果操作不成功,返回时CF被置成1.这时,AX中包含了错误代码,用来指明对磁盘文件操作失败的原因 
表6.2列出了01~36的错误代码及与之对应的错误信息 
6. 数据传送区
在文件处理过程中,从磁盘读出的数据或要写入磁盘的数据,都要存放在一个指定的内存区域,这个区域称为数据传送区(DTA),或者"磁盘缓冲区". 
功能号
(AH)
功 能
调用参数
返回参数
3CH
建立文件
DS=ASCIZ串段基址
DX=ASCIZ串偏移地址
CX=文件属性
CF=0操作成功:
AX=文件代号
CF=l操作出错:
AX=错误代码
3DH
打开文件
DS=ASCIZ串段基址
DX=ASCIZ串的偏移地址
AL=存取代码
CF=0操作成功:
AX=文件代号
CF=l操作出错:
AX=错误代码
3EH
关闭文件
BX=文件代号
CF=0操作成功 
CF=l操作出错: 
AX=错误代码
表6.2 文件系统功能调用
3FH
读文件或设备
DS=数据缓冲区段基址
DX=数据缓冲区偏移地址
BX=文件代号
CX=读取的字节数
CF=0读成功: AX=实际读入的字节数AX=0表示文件结束
CF=1读出错: AX=错误代码
40H
写文件或设备
DS=数据缓冲区段基址
DX=数据缓冲区偏移地址
BX=文件代号
CX=写入的字节数
CF=0写成功: 
AX=实际写入的字节数
CF=1写出错: 
AX=错误代码
功能号
(AH)
功 能
调用参数
返回参数
42H
移动文件指针
CX=所需字节的偏移地址(高位)
DX=所需字节的偏移地址(低位)
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)
功 能
调用参数
返回参数
1. 文件的建立
对于一个磁盘上不存在的文件,使用之前首先要"建立"这个文件 .
注意:建立文件时,应确保在同一个目录中该文件不存在,否则将覆盖原来存在的同名文件,造成信息的丢失,除非你用这种方法同时"删除"一个不再需要的老文件.
6.2.2 文件的建立,打开和关闭 
DATA SEGMENT
FILENAME DB 'D:\STUDENT\TEST1.DAT', 0
HANDLE DW 
SUCCESS DB 0DH, 0AH, 'The file has been CREATED. $'
FAIL DB 0DH, 0AH, 'The file fail to be CREATED. $' 
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE,DS: DATA
START: MOV AX, DATA
MOV DS, AX 
[例6-4] 在D盘的STUDENT文件夹下建立一个名为TEST1.DAT文件,建立成功显示"The file has been CREATED.",将文件代号存放在FILENUM字单元,否则显示"The file fail to be CREATED.". 
LEA DX, FILENAME; ASCIZ串地址置入DS: DX
MOV CX, 0 ; 文件属性为0(普通文件)
MOV AH, 3CH
INT 21H ; 建立该文件
JNC SUCCE ; CF=0,转SUCCE
LEA DX, FAIL ; CF=1,置出错信息地址
JMP QUIT
SUCCE:MOV HANDLE, AX ; 保存文件代号
LEA DX, SUCCESS ; 取"成功"信息地址
QUIT: MOV AH, 09H 
INT 21H ; 显示成功/失败信息
MOV AH, 4CH
INT 21H
CODE ENDS
END START
2. 文件的打开
对一个已经存在的磁盘文件进行读,写操作前,首先要"打开"这个文件 .
存取代码 :存取代码告诉操作系统打开文件要进行什么样操作. 
打开一个文件: AH = 3DH
DS: DX = ASCIZ串首地址
AL=文件存取代码
只读文件只能用代码0来打开,如果使用存取代码1或2时将报告错误.
打开一个不存在的文件同样也会报告错误.
常用的文件存取代码:
0:为读而打开文件
1:为写而打开文件
2:为读和写打开文件
3. 关闭文件
一个文件读写完毕之后,需要将它关闭,这个文件从"活动状态"回复到"静止"状态. 
关闭文件的操作通过3EH的DOS功能调用实现
6.3 文件读写 
6.3.1 文件写
6.3.2 文件读 
6.3.2 文件指针
将一组信息记录写入文件中,用户需要进行如下的操作:
建立文件:使用3CH的DOS功能调用建立这个文件,保存返回的文件代号.
写文件:把需要写入磁盘文件的内容写入"磁盘缓冲区",然后使用40H的DOS功能调用把这些信息写入文件.
关闭文件:使用3EH的DOS功能调用关闭这个文件.
6.3.1 文件写 
[例6-5] 下面的程序首先要求输入一个磁盘文件名,随后把键盘输入的文字存放到这个磁盘文件中.
DATA SEGMENT
MESS0 DB 0DH, 0AH, "Input File Name Please: $"
BUFFER DB 60, 
FILENAME DB 60 DUP( )
HANDLE DW 
DTA DB 
PROMPT DB 0DH, 0AH, 'Input Text Please: $'
SUCCESS DB 0DH, 0AH, 'Write Success $'
FAIL1 DB 0DH, 0AH, 'Fail to Create $'
FAIL2 DB 0DH, 0AH, 'Fail to Write $'
DATA ENDS
CODE SEGMENT 
ASSUME CS: CODE, DS: DATA
START:MOV AX, DATA
MOV DS, AX
LEA DX, MESS0 ; 为输入文件名输出提示信息
MOV AH, 09H
INT 21H
LEA DX, BUFFER ; 输入文件名
MOV AH, 0AH
INT 21H
MOV BL, BUFFER+1
MOV BH, 0
MOV FILENAME[BX], 0
; 把回车字符修改为00H,形成ASCIZ串
LEA DX, FILENAME ;ASCIZ串首地址装入DS: DX
MOV AH, 3CH ;建立文件的功能代号
MOV CX, 00H ;文件属性(普通文件)
INT 21H ;建立文件
JC ERR1 ;建立出错,转ERR1
MOV HANDLE, AX ;保存文件代号
LEA DX, PROMPT
MOV AH, 09H
INT 21H ;显示提示信息,要求用户键盘输入
LEA DX, DTA ;DTA首地址装入DS: DX
MOV BX, HANDLE ;文件代号装入BX
AGAIN:MOV AH, 01H
INT 21H
MOV DTA, AL ;键盘上输入一个字符,送入DTA
AGN1:MOV AH, 40H
MOV CX, 1
INT 21H ;把这个字符写入磁盘文件
JC ERR2 ;写文件错误,转ERR2
CMP DTA, 0DH ;刚输入字符是回车 
JNE AGN2
PUSH DX ;保护DX的值
MOV AH, 2
MOV DL, 0AH
INT 21H ;回车字符后面输出换行
POP DX ;恢复DX的值
MOV DTA, 0AH ;换行字符填入DTA
JMP AGN1 ;换行字符补写到磁盘文件
AGN2: CMP DTA, 1AH ;刚输入字符是EOF 
JNE AGAIN ;不是EOF,继续键盘输入
LEA DX, SUCCESS
CALL DISP ;显示写文件成功信息
CLOSE:MOV AH, 3EH
MOV BX, HANDLE
INT 21H ;关闭文件
JMP EXIT
ERR1: LEA DX, FAIL1
CALL DISP ;显示打开错误信息
JMP EXIT ;打开不成功,无需关闭,转EXIT结束
ERR2: LEA DX, FAIL2 ;显示写文件错信息
CALL DISP
JMP CLOSE ;文件已打开,需要关闭
EXIT: MOV AH, 4CH
INT 21H ;返回OS
DISP: MOV AH, 09H
INT 21H
RET
CODE ENDS
END START 
1. 从文件中读出信息,需要以下操作:
打开文件:使用3DH的DOS功能调用打开这个文件,保存返回的文件代号 
读文件:把"磁盘缓冲区"首地址装入DS: DX,文件代号装入BX,读取字节数装入CX,使用3FH的DOS功能调用把文件信息读到磁盘缓冲区内 
关闭文件:使用3EH的DOS功能调用关闭这个文件
6.3.2 文件读
[例6-6] 打开磁盘上的一个文本文件,将它的内容显示在显示器上
(类似于DOS命令TYPE).
;EX606.ASM
DATA SEGMENT
HANDLE DW 
DTA DB 
PROMPT0 DB 0DH, 0AH, 'No Filename in Command Line. $'
PROMPT1 DB 0DH, 0AH, 'Open File Error. $'
PROMPT2 DB 0DH, 0AH, 'Read File Error. $'
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START:CLD 
MOV DI, 0081H ;命令行参数区在PSP中的偏移量
CMP BYTE PTR[DI-1], 0 ;有参数字符 
JE ERR0 ;参数为"空",报告错误
MOV AL, 0DH
MOV CX, 40
REPNE SCASB ;测试参数长度
JNZ ERR0 ;长度超过40字符,报告错误
MOV BYTE PTR [DI-1], 0
;将回车字符修改为0,形成ASCIZ串_
MOV DX, 0081H ;DS: DX指向ASCIZ串
MOV AH, 3DH
MOV AL, 0 ;打开方式0,为读打开
INT 21H ;打开这个文件
JC ERR1 ;打开失败,转ERR1
MOV CX, DATA
MOV DS, CX ;装载DS
MOV HANDLE, AX ;保存文件代号_
AGAIN:LEA DX, DTA ;DS: DX指向DTA
MOV BX, HANDLE ;BX=文件代号
MOV CX, 1 ;CX=读取字节数
MOV AH, 3FH
INT 21H ;从文件中读1字节,存入DTA
JC ERR2 ;读错,转ERR2
CMP AX, 0 ;读出字节数为0 
JE CLOSE ;读出字节数为0,转CLOSE
CMP DTA, 1AH ;读出内容是EOF 
JE CLOSE ;读出内容是EOF,转CLOSE
MOV DL, DTA
MOV AH, 2
INT 21H ;将读出字符送显示器输出
JMP AGAIN ;重复上述过程
ERR0: MOV AX, DATA ;尚未装载DS
MOV DS, AX ;为显示出错信息装载DS
LEA DX, PROMPT0
CALL DISP ;显示"命令行无参数"错误
JMP EXIT
ERR1: MOV AX, DATA ;尚未装载DS
MOV DS, AX ;为显示出错信息装载DS
LEA DX, PROMPT1
CALL DISP ;显示"文件打开错误" 
JMP EXIT
ERR2: LEA DX, PROMPT2
CALL DISP ;显示"文件读错误"
CLOSE:MOV AH, 3EH
MOV BX, HANDLE
INT 21H ;关闭文件
EXIT: MOV AH, 4CH
INT 21H ;返回OS
DISP: MOV AH, 09H
INT 21H
RET
CODE ENDS
END START
1. 文件的指针
"文件指针"变量,记录着应从文件的什么地方读出数据,或者,应向文件的什么地方写入数据. 
如果需要读,写文件中某一个指定位置开始的内容,则首先要使文件指针指向该位置. 
操作系统提供了移动文件指针的功能(功能号42H).
6.3.3 文件指针
入口:
BX= 文件代号.
CX: DX= 双字长的偏移值,带符号整数,正数或负数.
AL= 指定指针调整的三种方式之一: 
=0 绝对移动方式,以文件开头位置加CX: DX偏移值来移动指针
=1 相对移动方式,以当前指针位置加CX: DX偏移值来移动指针
=2 绝对倒移方式,以文件尾的位置加CX: DX偏移值来移动指针
出口:
如果成功(CF=0),CX: DX中为移动后的新指针的值.
移动文件指针操作(功能号42H)
2. 文件追加 :在已有的文件后面添加新的记录 
以写方式打开这个文件(AL=1) 
取CX:DX=00:00,使用AL=2的绝对倒移方式移动指针,使文件指针指向文件尾部; 
把追加内容存入磁盘缓冲区; 
使用AH=40H的系统功能调用,把磁盘缓冲区内容写入文件; 
重复步骤 3),4),直到所有内容写入文件; 
关闭这个文件.
[例6-7] 把文本文件D:\MYDOC2.TXT拼接在文本文件
D:\MYDOC1.TXT的后面,实现文件的"连接".
DATA SEGMENT
FILENAME1 DB 'D:\MYDOC1.TXT', 0
FILENAME2 DB 'D:\MYDOC2.TXT', 0
DTA DB 256 DUP ( ) ; 磁盘缓冲区
HANDLE1 DW 
HANDLE2 DW 
DONE DB 0 ; 文件2读操作完成标志
FAIL1 DB 0DH, 0AH, 'Open File Error. $'
FAIL2 DB 0DH,0AH,'Move File Pointer Error. $'
FAIL3 DB 0DH, 0AH, 'Read File Error. $'
FAIL4 DB 0DH, 0AH, 'Write File Error. $ '
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX, DATA
MOV DS, AX
MOV DONE, 0 ; 置"未完成"标志

LEA DX,FILENAME1 ; 为"写"打开文件1
MOV AL,01H
MOV AH,3DH
INT 21H
JC ERR11 ; 打开不成功,转ERR11
MOV HANDLE1, AX ;保存文件代号
LEA DX, FILENAME2 ; 为"读"打开文件2
MOV AL, 0
MOV AH, 3DH
INT 21H
JC ERR12 ; 打开不成功,转ERR12
MOV HANDLE2, AX ;保存文件代号_
MOV AH, 42H ; 把文件1指针移动到文件尾部
MOV AL, 02
MOV DX, 0
MOV CX, 0
MOV BX, HANDLE1
INT 21H
JC ERR2 ; 移动指针不成功,转ERR2
AGAIN:MOV AH, 3FH ; 读文件2
LEA DX, DTA
MOV BX, HANDLE2
MOV CX, 256
INT 21H
JC ERR3 ; 读文件失败,转ERR3
PUSH AX
CMP AX, 0
JNE AGA1
MOV DONE, 1
JMP FINISH ; 文件结束,转FINISH
AGA1: CMP AX, 256
JE CONT
MOV DONE, 1 ; 文件结束,置完成标志
CONT:MOV AH, 40H ; 写文件1
LEA DX, DTA
MOV BX, HANDLE1
POP CX
INT 21H
JC ERR4 ; 写文件失败,转ERR4
CMP DONE, 0
JE AGAIN
FINISH:MOV AH, 3EH ; 关闭文件2
MOV BX, HANDLE2
INT 21H
FINISH1:MOV AH, 3EH
MOV BX, HANDLE1 ; 关闭文件1
INT 21H
JMP EXIT
ERR11: LEA DX, FAIL1 ; 打开文件1失败,显示信息
MOV AH, 09H ; 然后返回操作系统
INT 21H
JMP EXIT 
ERR12: LEA DX, FAIL1 ; 打开文件2失败,显示信息
MOV AH, 09H ; 转向FINISH1,关闭文件1
INT 21H
JMP FINISH1
ERR2: LEA DX, FAIL2 ; 移动指针失败,显示信息
JMP DISP
ERR3: LEA DX, FAIL3 ; 读文件失败,显示信息
JMP DISP
ERR4: LEA DX, FAIL4 ; 写文件失败,显示信息 
DISP: MOV AH, 09H ; 显示出错信息
INT 21H 
JMP FINISH ; 转FINISH,关闭文件
EXIT: MOV AX, 4C00H
INT 21H
CODE ENDS
END START
假设文件"D:\MYDOC1.TXT"和"D:\MYDOC2.TXT"已经存在,先后执行命令:
D:\TASM5>DIR D:\MYDOC .TXT
D:\TASM5>EX607
D:\TASM5>DIR D:\MYDOC .TXT
D:\TASM5>TYPE D:\MYDOC1.TXT
将会发现,执行程序"EX607.EXE"之后,文件"MYDOC1.TXT"的长度是执行之前文件"D:\MYDOC1.TXT"和"D:\MYDOC2.TXT"长度之和,而且它的内容也是原来这两个文件内容的"连接". 
3. 文件随机读写
"顺序读","顺序写" :对文件的读写都是从文件头部开始顺序进行. 
记录 :许多磁盘文件内部由若干"组"信息组合而成的 ,这个信息"组"称为"记录(Record)" .
随机读写文件 :文件的读写以"记录"为单位进行,可以按照记录的自然顺序进行,也可以任意选择其中的一个或几个记录进行.
(1)_建立随机读写文件
用AH=3CH功能建立文件;
将磁盘缓冲区"清空";
用顺序写方式重复写入文件,
得到一个由若干个等长"空"记录组成的随机读写文件.
对"随机读写文件"进行操作时,磁盘缓冲区大小一般等于文件内一个记录的长度.
(2)__随机读文件
用AH=3DH功能打开该文件;
根据记录号计算出该记录在文件内的位置;
用AH=42H功能将文件指针指向该记录;
用AH=3FH功能读出该记录. 
(3)__随机写文件
用AH=3DH功能打开该文件;
根据记录号计算出该记录在文件内的位置;
用AH=42H功能将文件指针指向该记录
(如果该记录不存在,则仿照建立文件的方法,在该
记录前面写入若干个"空"记录);
将该记录内容写入磁盘缓冲区;
用AH=40H功能将新内容写入该记录.
(4)__修改文件内容
用AH=3DH功能打开该文件;
根据记录号计算出该记录在文件内的位置;
用AH=42H功能将文件指针指向该记录;
将该记录内容读入磁盘缓冲区;
在缓冲区内修改该记录内容;
用AH=42H功能将文件指针重新指向该记录;
用AH=40H功能将修改后内容写入该记录.
4. 文件修改 (修改前后文件长度发生改变) 
设被修改的文件由A,B,C三段组成,修改"B"这一段内容 
(1) 以"读"方式打开待修改文件;
(2)建立一个临时文件;
(3)从文件头部开始,读出待修改文件的"A"区内容,写入
临时文件;
(4)将修改后的"B"区内容写入磁盘缓冲区,写入临时文件
(5)将待修改文件指针指向"C"区,读出"C"区内容,写入
临时文件;
(6)关闭两个文件;
(7)待修改文件更名为同名的".BAK"文件,将临时文件更名
为原来的待修改文件名.
6.4 设备文件 
1. 设备文件
"文件"是存在于计算机"主机"外部,可以进行"读","写"操作的一种信息载体 
键盘,显示器等输入输出设备也可以称为"文件"
设备文件:键盘,显示器,串行通讯接口,打印机被称为"设备文件"
表6-3列出操作系统为标准字符设备分配固定的"文件代号"
设备文件代号
标准设备
0000
标准输入设备,通常是键盘
0001
标准输出设备,通常是显示器
0002
错误输出设备,总是指显示器
0003
标准辅助设备,通常为串行通信端口
0004
标准打印机
表6.3 字符设备文件代号与标准设备 
[例] 从键盘输入80个字符存入内存IN_BUFFER
. MODEL SMALL
. DATA
IN_BUFFER DB 80 DUP( )
. CODE
START:
MOV AX, @DATA
MOV DS, AX
LEA DX, IN_BUFFER
MOV AH, 3FH 
MOV CX, 80
MOV BX, 0
INT 21H
JC ERROR
……
下面的程序把OUT_BUFFER中的17个字符送显示器输出.
. MODEL SMALL
. DATA
OUT_BUFFER DB 0DH,0AH, "How are you "
DB 0DH,0AH 
. CODE
START:
MOV AX, @DATA
MOV DS, AX
LEA DX, OUT_BUFFER
MOV AH, 40H
MOV CX, 17
MOV BX, 1
INT 21H
JC ERROR
……
6.1__ 使用串操作指令,在STRING字符串中查找有无字符
'A',如有将标志flag置1,否则将flag清0.
6.2__使用串操作指令从左到右把字符串STRING1中的字符
送到STRING2中.
6.3_ 使用串操作指令从右到左把字符串STRING1中的字符
送到STRING2中.
6.4_ 在STRING中查找空格,记下最后一个空格的位置,
存放在变量SPACE中.如果没有空格,置SPACE为
-1.
习题六
6.5__ 两个字符串str1与str2以"$"字符结束,比较它们的长度
是否相同,如果相同,在屏幕上显示"Yes",否则显示
"No".
6.6__ 什么是文件 什么是文件代号 
6.7__ 如何用文件代号方式来建立文件 打开文件 关闭文件

6.8__ 文件属性指的是什么 
6.9__ 编写程序,建立一个名为File1.txt的文件,建立成功则
在屏幕上显示"SUCCESS",否则显示"ERROR".
6.10_ 打开文件时,先要在AL中设置文件存取代码,其作用
是什么
0 0