首页 > 汇编语言 > 汇编语言MS-Windows编程
汇编语言实例:文件I/O(输入/输出)过程
下面通过两个实例程序来演示文件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如果文件不能打开,则程序报告错误:
如果程序不能从文件读取,则报告错误。比如,假设有一个错误为在读文件时使用了不正确的文件句柄:
缓冲区可能太小,无法容纳文件:
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算