第6章字符串与文件.ppt_第1页
第6章字符串与文件.ppt_第2页
第6章字符串与文件.ppt_第3页
第6章字符串与文件.ppt_第4页
第6章字符串与文件.ppt_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 汇编语言程序设计简明教程 2 第六章字符串与文件处理 6 1串处理指令6 2文件的建立和打开6 3文件读写6 4设备文件习题六 3 字符串 计算机中常常用到字符串 如变量名 文件名等都是字符串 每个字符的编码占用一个字节 连续地存存贮在内存储器中 文件 文件是存放在外存储器上的程序或数据 4 6 1串处理指令 6 1 1与无条件重复前缀配合使用的串指令6 1 2与有条件重复前缀配合使用的指令 5 串操作指令的共同特点 源操作数由DS SI 提供 有时也可以由AL AX EAX提供 目的操作数由ES DI 提供每执行一次串操作 自动修改SI和 或 DI 使其指向下一个字节 字或双字方向标志DF控制对SI DI递增或是递减指令STD将DF置1 指令CLD将DF清0 6 1 MOVS字符串传送指令格式 MOVSB MOVSW MOVSD执行的操作 1 目的操作数单元 源操作数 ES DI DS SI 2 修改SI和DI值 6 1 1与无条件重复前缀REP配合使用的指令 7 2 REP串重复操作前缀格式 REP串操作指令执行的操作 重复执行串操作指令 直到CX的值为零如果 CX 0 1 CX CX 1 2 执行串指令 3 转向 1 如果 CX 0 结束本指令操作 8 例6 1 把长度为100的字符串str1复制到str2开始的存储单元中 假设已经执行如下指令 装载了DS SI和ES DI MOVAX SEGstr1 源数据的段地址送入DSMOVDS AXLEASI str1 源数据的起始偏移地址送入SIMOVAX SEGstr2 目的数据的段地址送入ESMOVES AXLEADI str2 目的数据的起始偏移地址送入DI 9 1 用循环控制方法编写的程序MOVCX 100 字符串长度送入CXAGAIN MOVAL SI 从源数据区取出一个字节MOVES DI AL 存入目的数据区INCSI 修改源数据区指针INCDI 修改目的数据区指针LOOPAGAIN 重复上面的操作100次 10 2 用字符串传送指令编写的程序MOVCX 100 字符串长度送入CXAGAIN MOVSB 从源数据传送一个字节到目的数据区LOOPAGAIN 重复上面的操作100次 3 用带重复前缀的字符串传送指令编写的程序CLD 方向标志DF清0MOVCX 100 字符串长度送人CXREPMOVSB 执行100次MOVSB指令 11 3 STOS存字符串指令格式 STOSB STOSW STOSD执行的操作 1 目的存储单元 累加器字节操作 ES DI AL 字操作 ES DI AX 双字操作 ES DI EAX 2 修改DI值 12 4 LODS取字符串指令格式 LODSB LODSW LODSD执行的操作 1 累加器 源存储单元字节操作 AL DS SI 字操作 AX DS SI 双字操作 EAX DS SI 2 修改SI值 13 1 CMPS串比较指令格式 CMPSB CMPSW CMPSD执行的操作 1 源操作数 目的操作数即 DS SI ES DI 不保存减法得到的差 但产生新的状态标志 2 修改SI和DI值 6 1 2与有条件重复前缀配合使用的指令 14 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串指令 的后续指令 15 例6 2 两个字符串STRING1 STRING2长度相同 编写一个程序 比较它们是否相同 1 用循环控制方法编写的程序段DATASEGMENTSTRING1DB ALLSTUDENTS STRING2DB ALLSTODENTS NEQUSTRING2 STRING1MESS1DB0DH 0AH Yes Stringsarematched MESS2DB0DH 0AH No Stringsarenotmatched DATAENDSCODESEGMENTASSUMECS CODE DS DATA 16 START MOVAX DATAMOVDS AXMOVES AXLEASI STRING1LEADI STRING2MOVCX NAGA MOVAL SI CMPAL ES DI JNENOINCSIINCDILOOPAGAJMPYES 17 NO LEADX MESS2JMPDISPYES LEADX MESS1DISP MOVAH 09HINT21HMOVAX 4C00HINT21HCODEENDSENDSTART 18 例6 2 2 用带重复前缀的字符串比较指令编写的程序 装载DS SI ES DI CX的程序同上 REPZCMPSBJNENOYES LEADX MESS1JMPDISPNO LEADX MESS2DISP 19 3 REPNZ REPNE当不为零 不相等时重复操作前缀该前缀与REPZ REPE对标志位ZF的判别条件刚好相反格式 REPNZ REPNE串指令执行的操作 如果ZF 0且 CX 0 重复串操作如ZF 0且 CX 0 则 1 执行串操作指令 2 CX CX 1ZF 1或 CX 0 停止执行本指令 执行下一条指令 20 4 SCAS串扫描指令格式 SCASB SCASW SCASD执行的操作 1 累加器 目的操作数字节操作 AL ES DI 字操作 AX ES DI 双字操作 EAX ES DI 2 修改DI值 21 例6 3 字符串由ASCII代码0表示结束 它的首地址由ES DI指出 编制函数LEN 求该字符串的长度 置入AX返回 函数 LEN 功能 求一个字符串的长度 入口 字符串首地址在ES DI中 字符串以ASC码0结束 出口 字符串的长度在AX中 影响寄存器 AX FLAGS 说明 假设字符串长度不超过60000字符 MODELSMALLPUBLICLEN CODE 22 LENPROCFARPUSHCXPUSHDICLDXORAX AXMOVCX 60000REPNESCASBMOVAX 60000SUBCXDECAXPOPDIPOPCXRETLENENDPEND 23 6 2文件的建立和打开 6 2 1文件6 2 2文件的建立 打开和关闭 24 1 路径名和ASCIZ串文件路径名指出该文件在辅助存储器上的位置 包括磁盘驱动器号 目录路径和文件名路径名和一个全0字节构成的字符串称为 ASCIZ 串2 文件代号操作系统为每个处于 活动 状态的文件分配一个用16位二进制表示的 文件代号 Handle 6 2 1文件 25 3 文件属性每个文件有一个记录该文件特性的字节 称为文件属性 该字节各位所代表的含义 D0 只读文件 该文件不能进行写操作D1 隐藏文件 用DIR查不到该文件D2 系统文件 用DIR查不到该文件D3 软盘的卷标号 该文件内容为磁盘的 卷标 D4 子目录 该文件内容为下一级文件的 目录 D5 归档位 已写入并关闭了的文件 硬盘用 26 4 文件代号方式的DOS功能调用磁盘文件的处理使用DOS或BIOS的功能调用来实现 DOS中断服务 INT21H 能实现高级的文件操作 只要给出文件名就能读写文件 表6 1给出了用文件代号方式实现文件管理的DOS功能调用 27 5 文件操作返回代码对磁盘文件进行操作 如果成功 返回时CF置为0 如果操作不成功 返回时CF被置成1 这时 AX中包含了错误代码 用来指明对磁盘文件操作失败的原因表6 2列出了01 36的错误代码及与之对应的错误信息6 数据传送区在文件处理过程中 从磁盘读出的数据或要写入磁盘的数据 都要存放在一个指定的内存区域 这个区域称为数据传送区 DTA 或者 磁盘缓冲区 28 表6 2文件系统功能调用 29 30 31 1 文件的建立对于一个磁盘上不存在的文件 使用之前首先要 建立 这个文件 注意 建立文件时 应确保在同一个目录中该文件不存在 否则将覆盖原来存在的同名文件 造成信息的丢失 除非你用这种方法同时 删除 一个不再需要的老文件 6 2 2文件的建立 打开和关闭 32 DATASEGMENTFILENAMEDB D STUDENT TEST1 DAT 0HANDLEDW SUCCESSDB0DH 0AH ThefilehasbeenCREATED FAILDB0DH 0AH ThefilefailtobeCREATED DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX 例6 4 在D盘的STUDENT文件夹下建立一个名为TEST1 DAT文件 建立成功显示 ThefilehasbeenCREATED 将文件代号存放在FILENUM字单元 否则显示 ThefilefailtobeCREATED 33 LEADX FILENAME ASCIZ串地址置入DS DXMOVCX 0 文件属性为0 普通文件 MOVAH 3CHINT21H 建立该文件JNCSUCCE CF 0 转SUCCELEADX FAIL CF 1 置出错信息地址JMPQUITSUCCE MOVHANDLE AX 保存文件代号LEADX SUCCESS 取 成功 信息地址QUIT MOVAH 09HINT21H 显示成功 失败信息MOVAH 4CHINT21HCODEENDSENDSTART 34 2 文件的打开对一个已经存在的磁盘文件进行读 写操作前 首先要 打开 这个文件 存取代码 存取代码告诉操作系统打开文件要进行什么样操作 打开一个文件 AH 3DHDS DX ASCIZ串首地址AL 文件存取代码 35 只读文件只能用代码0来打开 如果使用存取代码1或2时将报告错误 打开一个不存在的文件同样也会报告错误 常用的文件存取代码 0 为读而打开文件1 为写而打开文件2 为读和写打开文件 36 3 关闭文件一个文件读写完毕之后 需要将它关闭 这个文件从 活动状态 回复到 静止 状态 关闭文件的操作通过3EH的DOS功能调用实现 37 6 3文件读写 6 3 1文件写6 3 2文件读6 3 2文件指针 38 将一组信息记录写入文件中 用户需要进行如下的操作 建立文件 使用3CH的DOS功能调用建立这个文件 保存返回的文件代号 写文件 把需要写入磁盘文件的内容写入 磁盘缓冲区 然后使用40H的DOS功能调用把这些信息写入文件 关闭文件 使用3EH的DOS功能调用关闭这个文件 6 3 1文件写 39 例6 5 下面的程序首先要求输入一个磁盘文件名 随后把键盘输入的文字存放到这个磁盘文件中 DATASEGMENTMESS0DB0DH 0AH InputFileNamePlease BUFFERDB60 FILENAMEDB60DUP HANDLEDW DTADB PROMPTDB0DH 0AH InputTextPlease SUCCESSDB0DH 0AH WriteSuccess FAIL1DB0DH 0AH FailtoCreate FAIL2DB0DH 0AH FailtoWrite DATAENDS 40 CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXLEADX MESS0 为输入文件名输出提示信息MOVAH 09HINT21HLEADX BUFFER 输入文件名MOVAH 0AHINT21HMOVBL BUFFER 1MOVBH 0MOVFILENAME BX 0 把回车字符修改为00H 形成ASCIZ串 41 LEADX FILENAME ASCIZ串首地址装入DS DXMOVAH 3CH 建立文件的功能代号MOVCX 00H 文件属性 普通文件 INT21H 建立文件JCERR1 建立出错 转ERR1MOVHANDLE AX 保存文件代号LEADX PROMPTMOVAH 09HINT21H 显示提示信息 要求用户键盘输入LEADX DTA DTA首地址装入DS DXMOVBX HANDLE 文件代号装入BX 42 AGAIN MOVAH 01HINT21HMOVDTA AL 键盘上输入一个字符 送入DTAAGN1 MOVAH 40HMOVCX 1INT21H 把这个字符写入磁盘文件JCERR2 写文件错误 转ERR2CMPDTA 0DH 刚输入字符是回车 JNEAGN2PUSHDX 保护DX的值MOVAH 2MOVDL 0AH 43 INT21H 回车字符后面输出换行POPDX 恢复DX的值MOVDTA 0AH 换行字符填入DTAJMPAGN1 换行字符补写到磁盘文件AGN2 CMPDTA 1AH 刚输入字符是EOF JNEAGAIN 不是EOF 继续键盘输入LEADX SUCCESSCALLDISP 显示写文件成功信息CLOSE MOVAH 3EHMOVBX HANDLEINT21H 关闭文件JMPEXIT 44 ERR1 LEADX FAIL1CALLDISP 显示打开错误信息JMPEXIT 打开不成功 无需关闭 转EXIT结束ERR2 LEADX FAIL2 显示写文件错信息CALLDISPJMPCLOSE 文件已打开 需要关闭EXIT MOVAH 4CHINT21H 返回OSDISP MOVAH 09HINT21HRETCODEENDSENDSTART 45 1 从文件中读出信息 需要以下操作 打开文件 使用3DH的DOS功能调用打开这个文件 保存返回的文件代号读文件 把 磁盘缓冲区 首地址装入DS DX 文件代号装入BX 读取字节数装入CX 使用3FH的DOS功能调用把文件信息读到磁盘缓冲区内关闭文件 使用3EH的DOS功能调用关闭这个文件 6 3 2文件读 46 例6 6 打开磁盘上的一个文本文件 将它的内容显示在显示器上 类似于DOS命令TYPE EX606 ASMDATASEGMENTHANDLEDW DTADB PROMPT0DB0DH 0AH NoFilenameinCommandLine PROMPT1DB0DH 0AH OpenFileError PROMPT2DB0DH 0AH ReadFileError DATAENDSCODESEGMENTASSUMECS CODE DS DATA 47 START CLDMOVDI 0081H 命令行参数区在PSP中的偏移量CMPBYTEPTR DI 1 0 有参数字符 JEERR0 参数为 空 报告错误MOVAL 0DHMOVCX 40REPNESCASB 测试参数长度JNZERR0 长度超过40字符 报告错误MOVBYTEPTR DI 1 0 将回车字符修改为0 形成ASCIZ串MOVDX 0081H DS DX指向ASCIZ串MOVAH 3DHMOVAL 0 打开方式0 为读打开INT21H 打开这个文件JCERR1 打开失败 转ERR1 48 MOVCX DATAMOVDS CX 装载DSMOVHANDLE AX 保存文件代号AGAIN LEADX DTA DS DX指向DTAMOVBX HANDLE BX 文件代号MOVCX 1 CX 读取字节数MOVAH 3FHINT21H 从文件中读1字节 存入DTAJCERR2 读错 转ERR2CMPAX 0 读出字节数为0 JECLOSE 读出字节数为0 转CLOSECMPDTA 1AH 读出内容是EOF JECLOSE 读出内容是EOF 转CLOSEMOVDL DTAMOVAH 2INT21H 将读出字符送显示器输出JMPAGAIN 重复上述过程 49 ERR0 MOVAX DATA 尚未装载DSMOVDS AX 为显示出错信息装载DSLEADX PROMPT0CALLDISP 显示 命令行无参数 错误JMPEXITERR1 MOVAX DATA 尚未装载DSMOVDS AX 为显示出错信息装载DSLEADX PROMPT1CALLDISP 显示 文件打开错误 JMPEXITERR2 LEADX PROMPT2CALLDISP 显示 文件读错误 50 CLOSE MOVAH 3EHMOVBX HANDLEINT21H 关闭文件EXIT MOVAH 4CHINT21H 返回OSDISP MOVAH 09HINT21HRETCODEENDSENDSTART 51 1 文件的指针 文件指针 变量 记录着应从文件的什么地方读出数据 或者 应向文件的什么地方写入数据 如果需要读 写文件中某一个指定位置开始的内容 则首先要使文件指针指向该位置 操作系统提供了移动文件指针的功能 功能号42H 6 3 3文件指针 52 入口 BX 文件代号 CX DX 双字长的偏移值 带符号整数 正数或负数 AL 指定指针调整的三种方式之一 0绝对移动方式 以文件开头位置加CX DX偏移值来移动指针 1相对移动方式 以当前指针位置加CX DX偏移值来移动指针 2绝对倒移方式 以文件尾的位置加CX DX偏移值来移动指针出口 如果成功 CF 0 CX DX中为移动后的新指针的值 移动文件指针操作 功能号42H 53 2 文件追加 在已有的文件后面添加新的记录以写方式打开这个文件 AL 1 取CX DX 00 00 使用AL 2的绝对倒移方式移动指针 使文件指针指向文件尾部 把追加内容存入磁盘缓冲区 使用AH 40H的系统功能调用 把磁盘缓冲区内容写入文件 重复步骤3 4 直到所有内容写入文件 关闭这个文件 54 例6 7 把文本文件D MYDOC2 TXT拼接在文本文件D MYDOC1 TXT的后面 实现文件的 连接 DATASEGMENTFILENAME1DB D MYDOC1 TXT 0FILENAME2DB D MYDOC2 TXT 0DTADB256DUP 磁盘缓冲区HANDLE1DW HANDLE2DW DONEDB0 文件2读操作完成标志FAIL1DB0DH 0AH OpenFileError FAIL2DB0DH 0AH MoveFilePointerError FAIL3DB0DH 0AH ReadFileError FAIL4DB0DH 0AH WriteFileError DATAENDS 55 CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVDONE 0 置 未完成 标志LEADX FILENAME1 为 写 打开文件1MOVAL 01HMOVAH 3DHINT21HJCERR11 打开不成功 转ERR11MOVHANDLE1 AX 保存文件代号 56 LEADX FILENAME2 为 读 打开文件2MOVAL 0MOVAH 3DHINT21HJCERR12 打开不成功 转ERR12MOVHANDLE2 AX 保存文件代号MOVAH 42H 把文件1指针移动到文件尾部MOVAL 02MOVDX 0MOVCX 0MOVBX HANDLE1INT21HJCERR2 移动指针不成功 转ERR2 57 AGAIN MOVAH 3FH 读文件2LEADX DTAMOVBX HANDLE2MOVCX 256INT21HJCERR3 读文件失败 转ERR3PUSHAXCMPAX 0JNEAGA1MOVDONE 1JMPFINISH 文件结束 转FINISHAGA1 CMPAX 256JECONTMOVDONE 1 文件结束 置完成标志 58 CONT MOVAH 40H 写文件1LEADX DTAMOVBX HANDLE1POPCXINT21HJCERR4 写文件失败 转ERR4CMPDONE 0JEAGAINFINISH MOVAH 3EH 关闭文件2MOVBX HANDLE2INT21HFINISH1 MOVAH 3EHMOVBX HANDLE1 关闭文件1INT21HJMPEXIT 59 ERR11 LEADX FAIL1 打开文件1失败 显示信息MOVAH 09H 然后返回操作系统INT21HJMPEXITERR12 LEADX FAIL1 打开文件2失败 显示信息MOVAH 09H 转向FINISH1 关闭文件1INT21HJMPFINISH1ERR2 LEADX FAIL2 移动指针失败 显示信息JMPDISPERR3 LEADX FAIL3 读文件失败 显示信息JMPDISPERR4 LEADX FAIL4 写文件失败 显示信息 60 DISP MOVAH 09H 显示出错信息INT21HJMPFINISH 转FINISH 关闭文件EXIT MOVAX 4C00HINT21HCODEENDSENDSTART 61 假设文件 D MYDOC1 TXT 和 D MYDOC2 TXT 已经存在 先后执行命令 D TASM5 DIRD MYDOC TXTD TASM5 EX607D TASM5 DIRD MYDOC TXTD TASM5 TYPED MYDOC1 TXT将会发现 执行程序 EX607 EXE 之后 文件 MYDOC1 TXT 的长度是执行之前文件 D MYDOC1 TXT 和 D MYDOC2 TXT 长度之和 而且它的内容也是原来这两个文件内容的 连接 62 3 文件随机读写 顺序读 顺序写 对文件的读写都是从文件头部开始顺序进行 记录 许多磁盘文件内部由若干 组 信息组合而成的 这个信息 组 称为 记录 Record 随机读写文件 文件的读写以 记录 为单位进行 可以按照记录的自然顺序进行 也可以任意选择其中的一个或几个记录进行 63 1 建立随机读写文件用AH 3CH功能建立文件 将磁盘缓冲区 清空 用顺序写方式重复写入文件 得到一个由若干个等长 空 记录组成的随机读写文件 对 随机读写文件 进行操作时 磁盘缓冲区大小一般等于文件内一个记录的长度 64 2 随机读文件用AH 3DH功能打开该文件 根据记录号计算出该记录在文件内的位置 用AH 42H功能将文件指针指向该记录 用AH 3FH功能读出该记录 65 3 随机写文件用AH 3DH功能打开该文件 根据记录号计算出该记录在文件内的位置 用AH 42H功能将文件指针指向该记录 如果该记录不存在 则仿照建立文件的方法 在该记录前面写入若干个 空 记录 将该记录内容写入磁盘缓冲区 用AH 40H功能将新内容写入该记录 66 4 修改文件内容用AH 3DH功能打开该文件 根据记录号计算出该记录在文件内的位置 用AH 42H功能将文件指针指向该记录 将该记录内容读入磁盘缓冲区 在缓冲区内修改该记录内容 用AH 42H功能将文件指针重新指向该记录 用AH 40H功能将修改后内容写入该记录 67 4 文件修改 修改前后文件长度发生改变 设被修改的文件由A B C三段组成 修

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论