Masm64:文件操作(API方式)

在 MASM64 中,可以使用系统调用或 Windows API 来进行文件操作。

一、创建文件

1. 使用 Windows API 创建文件

使用CreateFile函数可以创建一个新文件或打开一个已存在的文件。以下是一个创建文件的示例代码:

.686p
.MODEL flat, stdcall
.STACK 4096
INCLUDE windows.inc
INCLUDE kernel32.inc
INCLUDE io.inc
.DATA
    file_name   DB "test.txt", 0
    file_handle   DWORD?
.CODE
main PROC
    ; 创建文件
    INVOKE CreateFile, ADDR file_name, GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL
    mov file_handle, eax
    .IF eax == INVALID_HANDLE_VALUE
        ; 处理创建文件失败的情况
        mov edx, OFFSET create_failed_text
        call write_string
        jmp end_program
    .ENDIF
    ; 关闭文件
    INVOKE CloseHandle, file_handle
    mov edx, OFFSET create_success_text
    call write_string
    end_program:
    ; 等待用户输入后退出
    call read_char
    mov eax, 0
    ret
main ENDP
create_failed_text  BYTE "Failed to create file.", 13, 10, 0
create_success_text BYTE "File created successfully.", 13, 10, 0

二、写入文件

1. 向文件写入数据

使用WriteFile函数可以向文件写入数据。以下是一个向文件写入字符串的示例代码:

.686p
.MODEL flat, stdcall
.STACK 4096
INCLUDE windows.inc
INCLUDE kernel32.inc
INCLUDE io.inc
.DATA
    file_name     DB "test.txt", 0
    file_handle   DWORD?
    buffer        DB "Hello, world!", 0
    bytes_written DWORD?
.CODE
main PROC
    ; 创建文件
    INVOKE CreateFile, ADDR file_name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
    mov file_handle, eax
    .IF eax == INVALID_HANDLE_VALUE
        ; 处理创建文件失败的情况
        mov edx, OFFSET create_failed_text
        call write_string
        jmp end_program
    .ENDIF
    ; 写入数据到文件
    INVOKE WriteFile, file_handle, ADDR buffer, LENGTHOF buffer - 1, ADDR bytes_written, NULL
    .IF eax == FALSE
        ; 处理写入文件失败的情况
        mov edx, OFFSET write_failed_text
        call write_string
        jmp close_file
    .ENDIF
    ; 关闭文件
    close_file:
    INVOKE CloseHandle, file_handle
    mov edx, OFFSET write_success_text
    call write_string
    end_program:
    ; 等待用户输入后退出
    call read_char
    mov eax, 0
    ret
main ENDP
create_failed_text BYTE "Failed to create file.", 13, 10, 0
write_failed_text  BYTE "Failed to write to file.", 13, 10, 0
write_success_text BYTE "Data written to file successfully.", 13, 10, 0

三、读取文件

1. 从文件读取数据

使用ReadFile函数可以从文件读取数据。以下是一个从文件读取数据并显示的示例代码:

.686p
.MODEL flat, stdcall
.STACK 4096
INCLUDE windows.inc
INCLUDE kernel32.inc
INCLUDE io.inc
.DATA
    file_name   DB "test.txt", 0
    file_handle DWORD?
    buffer      BYTE 100 DUP(?)
    bytes_read  DWORD?
.CODE
main PROC
    ; 打开文件
    INVOKE CreateFile, ADDR file_name, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
    mov file_handle, eax
    .IF eax == INVALID_HANDLE_VALUE
        ; 处理打开文件失败的情况
        mov edx, OFFSET open_failed_text
        call write_string
        jmp end_program
    .ENDIF
    ; 读取文件内容
    INVOKE ReadFile, file_handle, ADDR buffer, LENGTHOF buffer - 1, ADDR bytes_read, NULL
    .IF eax == FALSE
        ; 处理读取文件失败的情况
        mov edx, OFFSET read_failed_text
        call write_string
        jmp close_file
    .ENDIF
    ; 显示读取的内容
    mov edx, ADDR buffer
    call write_string
    ; 关闭文件
    close_file:
    INVOKE CloseHandle, file_handle
    mov edx, OFFSET read_success_text
    call write_string
    end_program:
    ; 等待用户输入后退出
    call read_char
    mov eax, 0
    ret
main ENDP
open_failed_text  BYTE "Failed to open file.", 13, 10, 0
read_failed_text  BYTE "Failed to read from file.", 13, 10, 0
read_success_text BYTE "Data read from file successfully.", 13, 10, 0

四、删除文件

1. 删除文件

使用DeleteFile函数可以删除一个文件。以下是一个删除文件的示例代码:

.686p
.MODEL flat, stdcall
.STACK 4096
INCLUDE windows.inc
INCLUDE kernel32.inc
INCLUDE io.inc
.DATA
file_name DB "test.txt", 0
.CODE
main PROC
    ; 删除文件
    INVOKE DeleteFile, ADDR file_name
    .IF eax == FALSE
        ; 处理删除文件失败的情况
        mov edx, OFFSET delete_failed_text
        call write_string
        jmp end_program
    .ENDIF
    mov edx, OFFSET delete_success_text
    call write_string
    end_program:
    ; 等待用户输入后退出
    call read_char
    mov eax, 0
    ret
main ENDP
delete_failed_text  BYTE "Failed to delete file.", 13, 10, 0
delete_success_text BYTE "File deleted successfully.", 13, 10, 0

请注意,以上代码中使用了一些假设的输入输出函数(如write_string和read_char),你需要根据实际情况进行实现或替换为适当的输入输出方法。此外,在实际应用中,还需要进行错误处理和资源清理,以确保程序的稳定性和可靠性。

64位汇编语言基础