【新书推荐】13.2 应用举例

本节内容:磁盘文件管理功能号调用应用举例。

例1:显示文本文件内容t13-1.asm。

例2:将键盘输入字符存入文件t13-2.asm。

例3:文件拼接t13-3.asm。

13.2.1 例1:显示文本文件内容

动手实验93写一个显示文本文件test.txt内容的程序。

在理解下面示例程序的基础上,自己独立编写源程序。编译完成后,在debug调试器中单步跟踪调试,以验证程序的正确性。

算法分析:

第一步:以只读方式打开文件,并检测错误;

第二步:循环顺序读文件,每次读一个字符,把所读字符在屏幕上显示出来,直到文件结束;

第三步:关闭文件;

流程图:如图13-1所示。

                                图13-1 显示文件内容

示例代码67

;程序名:t13-1.asm

; 写一个显示文本文件test.txt内容的程序

;txt文本文件结束符ASCII码为1AH

;子程序readch,每次从文件中顺序读一个字符,CF=1,读时错误,CF=0时,正确。

;主程序通过CF位判断是否读取成功

;考虑:万一文件没有结束符,读到的字符数为0时文件结束,并返回一个文件结束符

;=========================================================================

;功能:显示当前目录下的文本文件test.txt

;符号常量定义

eof=1ah   ;文件结束符ASCII码值

assume cs:code,ds:data

data segment

fname db 'test.txt',0         ;文件名

;提示信息,07h=响铃

error1 db 'File not found',07h,0      

error2 db 'Reading error',07h,0

buffer db ?                          ;1字节的缓冲区

handle dw ?

data ends

code segment

start:

         mov ax,data

         mov ds,ax

         ;只读方式打开文件

;置文件名首地址

         mov dx,offset fname

 ;只读方式打开文件

         mov ax,3d00h 

         int 21h

         jnc open_ok ;CF=0打开成功转

         mov si,offset error1 ;打开失败

;显示打开不成功提示信息

         call dmess

         jmp over           ;结束

open_ok:

         mov bx,ax         ;保存文件柄                                        

         mov handle,ax

         ;从文件中读取一个字符

cont: ;从文件中读取一个字符

         call readch

         jc readerr ;如读错,则转

         cmp al,eof ;读到文件结束符?

         jz type_ok

         call putch          ;显示所读字符                                            

         jmp cont                                                                                     

        

readerr:                                                                                     

         mov si,offset error2

         call dmess         ;显示错误提示信息       

         ;       

type_ok:

         mov bx,handle

         mov ah,3eh      ;关闭文件

         int 21h

over:

         mov ax,4c00h

         int 21h

;==============================================  

;子程序,屏幕显示al内容

;2号调用功能,向屏幕写入dl内容

;入口参数dl

putch proc

         push dx

         mov dl,al

         mov ah,2

         int 21h

         pop dx

         ret

putch endp

;-------------------------------------

;子程序:从文件中读取一个字符

;子程序名:readch

readch proc

         mov cx,1           ;置读字节数

         mov dx,offset buffer        ;置读缓冲区地址

         mov ah,3fh       ;置功能调用号

         int 21h

         jc readch2         ;cf=1

         cmp ax,cx          ;判断文件是否结束,ax为实际读到的字节数

         mov al,eof        ;设文件已结束,置文件结束符,此时CF=0

         jb readch1        ;文件已结束,转

         mov al,buffer   ;取所读字符

readch1:

         clc                       ;文件结束CF=0

readch2:

         ret

readch endp

;---------------------------------------

;子程序显示一个以0结尾的字符串

;子程序名:dmess

;入口参数si=字符串首地址

;出口参数无

dmess proc

dmess1:

         mov dl,[si]

         inc si

         or dl,dl

         jz dmess2

         mov ah,2

         int 21h

         jmp dmess1

dmess2:

         ret   

dmess endp

code ends

end start

提示

1.示例代码64每次只从文件读取一个字节数据,可以改为每次读取多个字节数据以提高效率。

2.如果文件内存在结束符,则结束符后的内容将无法读取,可以修改为不以结束符为判断依据。

请读者根据上述两点建议,尝试修改示例,独立完成。

13.2.2 例2:将键盘输入字符存入文件

动手实验94写一个把键盘上输入的字符(直到CTRL+Z键,值1AH)写入一个文件的程序。

在理解下面示例程序的基础上,自己独立编写源程序。编译完成后,在debug调试器中单步跟踪调试,以验证程序的正确性。

算法分析:

先建立指定文件,然后读键盘,把所有字符顺序写入文件,循环到文件结束符1AH,最后关闭文件。

流程图:如图13-2所示。

                        图13-2 键盘输入存入文件       

示例代码68

;程序名:t13-2.asm

;例2:写一个能把键盘上输入的字符(直到CTRL+Z键,值1AH)写入一个文件的程序。

;文件固定为当前根目录下的tast.txt。如果它已存在,则更新它

;===========================================================

;功能:把键盘上输入的字符全部存入

;文件test.txt。

;常量定义

eof=1ah                      ;结束符

assume cs:code,ds:data

data segment

fname db 'tast.txt',0         ;文件名

errmess1 db 'Can not create file',07h,'$'

errmess2 db 'Writing error',07h,'$'

buffer db ?        ;一个字节缓冲区

handle dw ?

data ends

code segment

start:

         mov ax,data

         mov ds,ax

         ;新建文件

         mov dx,offset fname

         mov cx,0  ;建立普通文件

         mov ah,3ch

         int 21h

         ;检测错误

         jnc crea_ok ;cf=0,建立成功跳转

;显示建立失败提示信息

         mov dx,offset errmess1

         ;调用显示字符串子程序

         call dispmess   

         jmp over 

crea_ok:                                               

         mov handle,ax         

         mov bx,ax         ;保存文件柄

cont:                                                                                                                                                       

         ;写法1

         call getchar      ;接收一个键

;保存AL=输入的ASCII码字符

         push ax            

         call writech      ;向文件写入字符                                                 

         pop ax               ;恢复ax值

         jc werror           ;cf=1,写入失败跳转

         cmp al,eof        ;判断是否结束

         jnz cont             ;不是,继续

         jmp closef         ;是,关闭文件

        

         ;写法2

         ;call getchar     ;接收一个键

;判断是否结束,没有写入结束符

         ;cmp al,eof                         

         ;jz closef            ;是,关闭文件

         ;call writech     ;向文件写入字符

         ;jc werror          ;cf=1,写入失败跳转                                

         ;jmp cont          ;不是,继续           

werror:

         mov dx,offset errmess2  ;显示写入错误提示信息

         call dispmess    ;调用子程序,显示提示信息

closef:

         mov bx,handle

         mov ah,3eh      ;调用功能号3eh,关闭文件

         int 21h

over:

         mov ax,4c00h

         int 21h     

;-----------------------------------------------       

;子程序:向文件写入字符

;子程序名:writech

;入口参数al,读到的字符ASCII码

;调用40h功能号,写入文件

writech proc

         mov buffer,al                      ;al移入缓冲区

         mov dx,offset buffer        ;缓冲区首地址

         mov cx,1                              ;每次写入一个字节

         mov ah,40h                         ;置功能号

         int 21h                                  ;写

         ret

writech endp

;-----------------------------------------      

;子程序:接收按键字符

;子程序名:getchar

;调用1号功能

;入口参数无

;出口参数:AL=读到字符的代码ASCII码

getchar proc

         mov ah,1

         int 21h

         ret

getchar endp

;-----------------------------------------

;子程序:显示字符串提示信息

;子程序名:dispmess

;入口参数:dx

;出口参数:无

dispmess proc

         mov ah,09h

         int 21h

         ret

dispmess endp

code ends

end start

提示

1.尝试一次读取多个字节数据;

2.按回车键或退格键时,会有些特殊异常,该如何处理?

请读者尝试完成修改。

13.2.3 例3:文件拼接

动手实验95写一个程序把文件test2.txt拼接到文件test1.txt上。

在理解下面示例程序的基础上,自己独立编写源程序。编译完成后,在debug调试器中单步跟踪调试,以验证程序的正确性。

算法分析:

第一步:为写打开文件test1.txt;

第二步:为读打开文件test2.txt;

第三步:把文件test1的读写指针移到尾;

第四步:读test2的一块到缓冲区;

第五步:写一个块到test1.txt,如此循环,直到test2.txt结束;

第六步:关闭两个文件;

流程图:如图13-3所示。

                                        图13-3 文件拼接

示例代码69

;程序名:t13-3.asm

;例3:写一个程序把文件test2.txt拼接到文件test1.txt上

;功能:把文件test2拼接到文件test1之后

;==================================================

;符号常量定义

bufflen=512

assume cs:code,ds:data

;数据段

data segment

fname1 db 'test1.txt',0             ;文件名1

fname2 db 'test2.txt',0             ;文件名2

handle1 dw 0                             ;存放文件1的文件柄

handle2 dw 0          ;存放文件2的文件柄

errmess1 db 'Can not open file',07h,'$'

errmess2 db 'Reading error',07h,'$'

errmess3 db 'Writing error',07h,'$'

buffer db bufflen dup(0)

data ends

;代码段

code segment

start:

         mov ax,data

         mov ds,ax

         ;打开文件1

         mov dx,offset fname1     ;打开文件1

         mov ax,3d01h                    ;只写方式打开       

         int 21h

         jc error1

         mov handle1,ax;打开成功,保存文件柄

         ;打开文件2

         mov dx,offset fname2    

         mov ax,3d00h           ;只读方式打开

         int 21h

         jc error2                     ;打开失败

         ;打开成功,保存文件2的柄                                             

         mov handle2,ax       

         ;移动文件内读写指针

         mov bx,handle1       

         xor cx,cx

         xor dx,dx

;移动文件1的指针到文件尾

         mov ax,4202h          

         int 21h

         ;拼接文件                                                                                  

cont: ;读取文件2,并写入文件1

;指针移到读文件2

         mov dx,offset buffer

         mov cx,bufflen

         mov bx,handle2                                   

         mov ah,3fh ;读文件2到缓冲区

         int 21h

         jc rerror             ;读取失败

         or ax,ax             ;判断是否读完?

         jz copyok           ;是,转结束

         ;写入文件1

;写到文件1的长度等于读出的长度

         mov cx,ax

         mov bx,handle1

         mov ah,40h      ;写入文件1

         int 21h

         jnc cont             ;写正确,继续

         jmp werror       ;写错误,跳转                                            

werror:

         mov dx,offset errmess3

         call dispmess

         jmp copyok

rerror:

         mov dx,offset errmess2                                                         

         call dispmess;显示读取错误提示信息  

copyok:

         mov bx,handle1        ;关闭文件1                                        

         mov ah,3eh

         int 21h

         mov bx,handle2        ;关闭文件2

         mov ah,3eh

         int 21h     

error2:

         mov bx,handle1        ;文件2打开失败

         mov ah,3eh               ;关闭文件1

         int 21h

         jmp over 

error1:

         mov dx,offset errmess1  ;显示提示信息

         call dispmess

         ;jmp over

over:

         mov ax,4c00h

         int 21h

;------------------------------------

;子程序:显示字符串提示信息

;子程序名:dispmess

;入口参数:dx

;出口参数:无

dispmess proc

         mov ah,09h

         int 21h

         ret

dispmess endp

code ends

end start

提示

1.可以尝试文件名有键盘输入;

2.可以尝试将两个文件合并为第三个文件;

请读者尝试完成修改。

练习

1、写一个复制指定文件程序。源文件名和目标文件名由用户从键盘输入。

2、写一个程序,把0000:0000地址开始的1024个字节写入文件MEM.DAT中。

3、写一个程序,把0000:0000地址开始的1024个字节,以双字为单位,以8字节十六进制ASCII码串的形式,顺序写入到文件MEM.TXT中,写入时每存放8字节ASCII码字符串换一行继续写入。

4、将例1改为每次从文件中读取指定字节数据。不以结束符为文件结尾标志。

5、将例2改成每次向文件写若干字节。并且屏蔽非可见字符。

6、修改程序例3,文件名由用户输入,并且把两个文件合并成第三个文件。

7、写一个能够显示指定文件长度的程序,文件名由键盘输入。

8、 写一个程序,统计文件中十进制数字符和字母符的个数,并以十进制ASCII字符串形式输出。

9、写一个比较文本文件的程序。假设文本文件由若干行组成,文本行以回车符0DH和换行符0AH结束。比较以行为单位按顺序进行。如果对应两行不等,那么就显示两行,并标上行号。

本文摘自编程达人系列教材《X86汇编语言基础教程》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/430028.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Centos 9 安装 k8s

为了尽可能契合生产环境的部署情况,这里用kubeadm安装集群,同时方便跟随笔记一步步实践的过程,也更加了解k8s的一些特性和基础知识。 先决条件 这里将通过虚拟机安装3台centos stream 9服务器,并组成kubeneters集群(…

如何在MinIO系统中进行配置并结合内网穿透实现公网远程连接上传文件

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 前言 MinIO是一款高性能、分布式的对象存储系统,它可以100%的运行在标准硬件上,即X86等…

ROS2中std_msgs/msg/Header 数据含义及使用

ROS2中std_msgs/msg/Headerr 数据含义及使用 ROS官方消息说明数据说明使用ros2标准的Header案例代码解释测试结果 ROS官方消息说明 ROS2中std_msgs消息包含类型 https://docs.ros2.org/latest/api/std_msgs/msg/std_msgs/msg/Header Message std_msgs/msg/Header数据格式&…

“零碳未来”:引领全球向低碳经济转型

全球环境基金(GEF),这个由183个国家和地区组成的国际合作组织,是世界银行1990年创建的实验项目,一直致力于支持环境友好型项目,推动全球环境改善。而“零碳未来”不仅是一个由全球环境基金(GEF)创建的跨越国界的全新交易平台,更是一个致力于推动全球向低碳经济转型的零碳排放生…

ChromeDriver全版本下载教程

确定自己的Chrome版本 step1. 打开Chrome浏览器右上角的三个点,再点击设置 step2. 在设置中点击“关于Chrome”,圈起来的红框即为当前Chrome版本,我的版本就是121.0.6167.185 在json中查找自己对应ChromeDriver版本下载链接 一般教程会让你…

2_SQL

文章目录 SQL数据完整性实体完整性域完整性参照完整性default(默认值)comment(注释) 多表设计一对一一对多多对多数据库三大范式第一范式:原子性第二范式:唯一性第三范式:数据的冗余 多表查询连…

【问题】解决c++调用exosip是报错,无法解析的外部符号 _DnsQueryConfig@24

问题描述: error LNK2019: 无法解析的外部符号 _DnsQueryConfig24,函数 _eXosip_dnsutils_naptr 中引用了该符号 DnsQueryConfig是windowAPI,可查阅msdn。 #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"Dnsapi.…

[最佳实践] conda环境内安装cuda 和 Mamba的安装

Mamba安装失败的过程中,causal-conv1d安装报错为连接超时 Mamba安装 主要故障是 pip install causal-conv1d1.2.0 安装失败 安装实践比较长,请耐心等待 解决方案 受到启发运行Mamba项目时无法直接用pip install安装causal_conv1d和mamba_ssm_pip insta…

突显借力之美:打造令人印象深刻的平面设计师简历!

作为一名平面设计师,简历不仅是展示你设计能力的重要工具,也是展示你专业素质和态度的重要参考。因此,如何写一份能让HR眼前一亮的简历已经成为每个平面设计师都需要掌握的技能。在本文中,我们将从四个方面探讨如何写好平面设计师…

如何准备2024年汉字小达人:历年考题练一练-18道选择题解析

距离2024年第11届汉字小达人比赛还有八个多月的时间,建议如果有可能都让孩子参加一下,无需报名费,如果没时间准备也可以直接上阵参赛,检验一下孩子语文字、词、成语和古诗文方面的掌握情况。一方面可以激发孩子学习语文的兴趣&…

cache基础

基本概念: cache line —— 缓存行,一般为 32B、64B 。way —— 路。set —— 组。VIPT —— Virtual Index Physical Tag。 Index来自虚拟地址。PIPT —— Physical Index Physical Tag。 Index来自物理地址。 cache 更新策略: write thr…

组基轨迹建模 GBTM的介绍与实现(Stata 或 R)

基本介绍 组基轨迹建模(Group-Based Trajectory Modeling,GBTM)(旧名称:Semiparametric mixture model) 历史:由DANIELS.NAGIN提出,发表文献《Analyzing Developmental Trajectori…

R语言简介、环境与基础语法及注释

R语言简介、环境与基础语法及注释 一、R语言1.R语言简介2.R语言官网3.R语言中国的镜像网站4.R语言下载5.R语言的历史 二、R语言环境1.Windows安装1.1 去 R 语言下载的镜像站点的列表下载1.2 选择版本进行下载1.3 点击运行1.4 一路默认,安装完毕! 2.Linux…

Golang Channel 详细原理和使用技巧

1.简介 Channel(一般简写为 chan) 管道提供了一种机制:它在两个并发执行的协程之间进行同步,并通过传递与该管道元素类型相符的值来进行通信,它是Golang在语言层面提供的goroutine间的通信方式.通过Channel在不同的 goroutine中交换数据,在goroutine之间…

yolov9训练

目录 说明 1、下载代码安装新的python环境 2、准备数据 3、修改代码 说明 本文参考该博主的文章,在已经有数据的情况,进行简单总结。需要详细版见原文链接如下:YOLOV9保姆级教程-CSDN博客 1、下载代码安装新的python环境 代码下载&…

阿里巴巴面试题:亿级商品如何存储?

嗨,各位小米粉丝们,欢迎来到小米的科技分享专栏!今天我们要聊的话题可是相当的烧脑,它来自阿里巴巴的一道面试题:亿级商品如何存储?别急,让我一一为你解密! 分库分表 当我们面对需要处理海量数据的情况时,基于 Hash 取模和一致性 Hash 实现分库分表是一个常见且有效…

【机器学习】生成对抗网络GAN

概述 生成对抗网络(Generative Adversarial Network,GAN)是一种深度学习模型架构,由生成器(Generator)和判别器(Discriminator)两部分组成,旨在通过对抗训练的方式生成逼…

【大前端】EChart 多系列柱状图绘制背景图

背景 在ECharts中,设置柱状图背景色,可通过backgroundColor设置,但仅限于单系列柱状图,所以在多系列柱状图中就需要用下面的方式设置 解决方案 1. xAxis.splitArea 如果设置的背景图的宽度占比为100%,则可以使用该方…

聊聊最近成交的一个小外贸订单

聊聊最近的一个小订单的故事吧,这个客户是个新手买家,也属于第一次在网上购物,客户在年前开始询问产品,而且当时正好是假期。 其实按照正常的处理思路来说,应该告诉客户现在是假期,大概是在什么时候恢复工…

详解点云PFH点云特征直方图原理(matlab代码实现)

原理; 原始论文下载【免费】(2008PFH)点云特征直方图原创论文,2008年资源-CSDN文库https://download.csdn.net/download/Vertira/88911005 PFH 特征描述是基于特征点(keypoint)与其邻域点的空间几何关系来编码的。如图1所示&…