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

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

更多...

加载中...