汇编语言L0C,汇编语言实例:文件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

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

jmp quit ; 退出

buf_size_ok:

mov buffer[eax],0 ; 插入空结束符

mWrite "File size: "

call WriteDec ; 显示文件大小

call Crlf

; 显示缓冲区

mWrite

mov edx,OFFSET buffer ; 显示缓冲区

call WriteString

call Crlf

close_file:

mov eax,fileHandle

call CloseFile

quit:

exit

main ENDP

END main

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

c23986347e1651dbf6b017b5e0fa01fe.gif

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

f085e46c78b86bcdb300b3ecc7f2818f.gif

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

174c3f5e387f84691321d53d11d40c16.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值