• 汇编语言Irvine32链接库文件I/O(输入/输出)

    Irvine32 库中包含了一些简化的文件 I/O 过程。这些过程已经封装到本章描述的 Win32 API 函数中。

    下面的源代码就给岀了 CreateOutputFile、OpenFile、WriteToFile、ReadFromFile 和 CloseFile:

    ;------------------------------------------------------
    CreateOutputFile PROC
    ;
    ; 创建一个新文件并以输出模式打开
    ; 接收: EDX 指向文件名
    ; 返回: 如果文件创建成功, EAX 包含一个有效的文件句柄。 
    ; 否则,EAX 等于 INVALID_HANDLE_VALUE
    ;------------------------------------------------------
        INVOKE CreateFile,
          edx, GENERIC_WRITE, DO_NOT_SHARE, NULL,
          CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
        ret
    CreateOutputFile ENDP
    
    ;-------------------------------------------------------
    OpenFile PROC
    ;打开一个新的文本文件进行输入。
    ;接收:EDX 指向文件名。
    ;返回:如果文件打开成功,EAX 包含一个有效的文件
    ;句柄。否则,EAX 等于 INVALID_HANDLE_VALUE。
    ;-------------------------------------------------------
        INVOKE CreateFilez
            edx, GENERIC_READ, DO_NOT_SHARE, NULL,
            OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
        ret
    OpenFile ENDP
    
    ;--------------------------------------------------------
    WriteToFile PROC
    ;
    ; 将缓冲区内容写入一个输出文件
    ; 接收: EAX = 文件句柄, EDX = 缓冲区偏移量,
    ;    ECX = 写入字节数
    ; 返回: EAX = 实际写入文件的字节数
    ; 如果 EAX 返回的值小于 ECX 中的参数, 则可能发生错误
    ;--------------------------------------------------------
    .data
    WriteToFile_1 DWORD ?        ; 已写入字节数
    .code
        INVOKE WriteFile,        ; 向文件写缓冲区
            eax,                 ; 文件句柄
            edx,                 ; 缓冲区指针
            ecx,                 ; 写入字节数
            ADDR WriteToFile_1,  ; 已写入字节数
            0                    ; 覆盖执行标志
        mov    eax,WriteToFile_1 ; 返回值
        ret
    WriteToFile ENDP
    
    ;--------------------------------------------------------
    ReadFromFile PROC
    ; 将一个输入文件读入缓冲区
    ; 接收: EAX = 文件句柄, EDX = 缓冲区偏移量,
    ;    ECX = 读字节数
    ; 返回: 如果 CF=0,EAX = 已读字节数
    ; 如果 CF=1,则EAX包含Win32 API 函数 GetLastError 返回的系统错误码
    ;--------------------------------------------------------
    .data
    ReadFromFile_1 DWORD ?            ; 已读字节数
    .code
        INVOKE ReadFile,
            eax,                      ; 文件句柄
            edx,                      ; 缓冲区指针
            ecx,                      ; 读取的最大字节数
            ADDR ReadFromFile_1,      ; 已读字节数
            0                         ; 覆盖执行标志
        mov    eax,ReadFromFile_1
        ret
    ReadFromFile ENDP
    
    ;--------------------------------------------------------
    CloseFile PROC
    ; 使用句柄为标识符关闭一个文件
    ; 接收: EAX = 文件句柄
    ; 返回: EAX = 非 0,如果文件被成功关闭
    ;--------------------------------------------------------
        INVOKE CloseHandle, eax
        ret
    CloseFile ENDP

更多...

加载中...