2025年4月3日 星期四 乙巳(蛇)年 正月初四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 汇编

汇编语言实例:文件I/O(输入/输出)过程

时间:03-05来源:作者:点击数:89

下面通过两个实例程序来演示文件I/O(输入/输出)的过程。

1) CreatFile 程序示例

下面的程序用输岀模式创建一个文件,要求用户输入一些文本,将这些文本写到输出文件,并报告已写入的字节数,然后关闭文件。在试图创建文件后,程序要进行错误检查:

  • ; 创建一个文件 (CreateFile.asm)
  • INCLUDE Irvine32.inc
  • BUFFER_SIZE = 501
  • .data
  • buffer BYTE BUFFER_SIZE DUP(?)
  • filename BYTE "output.txt",0
  • fileHandle HANDLE ?
  • stringLength DWORD ?
  • bytesWritten DWORD ?
  • str1 BYTE "Cannot create file",0dh,0ah,0
  • str2 BYTE "Bytes written to file [output.txt]: ",0
  • str3 BYTE "Enter up to 500 characters and press "
  • BYTE "[Enter]: ",0dh,0ah,0
  • .code
  • main PROC
  • ; 创建一个新文本文件
  • mov edx,OFFSET filename
  • call CreateOutputFile
  • mov fileHandle,eax
  • ; 错误检查
  • cmp eax, INVALID_HANDLE_VALUE ; 发现错误?
  • jne file_ok ; 否: 跳过
  • mov edx,OFFSET str1 ; 显示错误
  • call WriteString
  • jmp quit
  • file_ok:
  • ; 提示用户输入字符串
  • mov edx,OFFSET str3 ; "Enter up to ...."
  • call WriteString
  • mov ecx,BUFFER_SIZE ; 输入字符串
  • mov edx,OFFSET buffer
  • call ReadString
  • mov stringLength,eax ; 计算输入字符数
  • ; 将缓冲区写入输出文件
  • mov eax,fileHandle
  • mov edx,OFFSET buffer
  • mov ecx,stringLength
  • call WriteToFile
  • mov bytesWritten,eax ; 保存返回值
  • call CloseFile
  • ; 显示返回值
  • mov edx,OFFSET str2 ; "Bytes written"
  • call WriteString
  • mov eax,bytesWritten
  • call WriteDec
  • call Crlf
  • quit:
  • exit
  • main ENDP
  • END main

2) ReacIFile 程序示例

下面的程序打开一个文件进行输入,将文件内容读入缓冲区,并显示该缓冲区。所有过程都从 Irvine32 链接库调用:

  • ; 读文件 (ReadFile.asm)
  • ; 使用 Irvine32.lib 的过程打开,读取并显示一个文本文件
  • INCLUDE Irvine32.inc
  • INCLUDE macros.inc
  • BUFFER_SIZE = 5000
  • .data
  • buffer BYTE BUFFER_SIZE DUP(?)
  • filename BYTE 80 DUP(0)
  • fileHandle HANDLE ?
  • .code
  • main PROC
  • ; 用户输入文件名
  • mWrite "Enter an input filename: "
  • mov edx,OFFSET filename
  • mov ecx,SIZEOF filename
  • call ReadString
  • ; 打开文件进行输入
  • mov edx,OFFSET filename
  • call OpenInputFile
  • mov fileHandle,eax
  • ; 错误检查
  • cmp eax,INVALID_HANDLE_VALUE ; 错误打开文件?
  • jne file_ok ; 否: 跳过
  • mWrite <"Cannot open file",0dh,0ah>
  • jmp quit ; 退出
  • file_ok:
  • ; 将文件读入缓冲区
  • mov edx,OFFSET buffer
  • mov ecx,BUFFER_SIZE
  • call ReadFromFile
  • jnc check_buffer_size ; 错误读取?
  • mWrite "Error reading file. " ; 是: 显示错误消息
  • call WriteWindowsMsg
  • jmp close_file
  • check_buffer_size:
  • cmp eax,BUFFER_SIZE ; 缓冲区足够大?
  • jb buf_size_ok ; 是
  • mWrite <"Error: Buffer too small for the file",0dh,0ah>
  • jmp quit ; 退出
  • buf_size_ok:
  • mov buffer[eax],0 ; 插入空结束符
  • mWrite "File size: "
  • call WriteDec ; 显示文件大小
  • call Crlf
  • ; 显示缓冲区
  • mWrite <"Buffer:",0dh,0ah,0dh,0ah>
  • mov edx,OFFSET buffer ; 显示缓冲区
  • call WriteString
  • call Crlf
  • close_file:
  • mov eax,fileHandle
  • call CloseFile
  • quit:
  • exit
  • main ENDP
  • END main

如果文件不能打开,则程序报告错误: 

如果程序不能从文件读取,则报告错误。比如,假设有一个错误为在读文件时使用了不正确的文件句柄:

缓冲区可能太小,无法容纳文件:

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门