从汇编语言的 txt 文件传输文本

Transfering Text from a txt file on Assembly language

所以我正在尝试使用 masm 学习汇编语言并进行一些编码练习,我想知道我的代码有什么问题

.386 
.model flat,stdcall 
option casemap:none 
include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
includelib \masm32\lib\user32.lib
include \masm32\include\kernel32.inc 
includelib \masm32\lib\kernel32.lib

.DATA
FileNameFrom db "file1.txt",0
FileNameTo db "file2.txt", 0

.DATA?
hFile HANDLE ?
hFile2 HANDLE ?
BWritten db ?
hMemory HANDLE ?
pMemory DWORD ?
SizeReadWrite DWORD ?
newfiletext dd ?

.CONST
MEMSIZE equ 65535

 .CODE
start: 

;-------;                                                       CREATE/OPEN
    push NULL
    push FILE_ATTRIBUTE_NORMAL
    push OPEN_EXISTING
    push NULL
    push 0
    push GENERIC_READ
    push offset FileNameFrom
    call CreateFile
;-------;
;or ~ invoke CreateFile,addr FileName,GENERIC_READ,0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
    mov hFile, eax


    invoke GlobalAlloc, GMEM_MOVEABLE OR GMEM_ZEROINIT, MEMSIZE
    mov hMemory, eax
    invoke GlobalLock, hMemory
    mov pMemory, eax


;-------;                                                           READ
    push NULL
    push offset SizeReadWrite
    push MEMSIZE-1
    push pMemory
    push hFile
    call ReadFile
;-------;;;or ~ invoke ReadFile,hFile,pMemory, MEMSIZE-1,ADDR SizeReadWrite,NULL 



    push NULL
    push hFile
    call GetFileSize
    mov newfiletext, eax

    invoke CloseHandle, hFile
                                                                 ; WRITE


    push NULL
    push FILE_ATTRIBUTE_NORMAL
    push CREATE_ALWAYS
    push NULL
    push 0
    push GENERIC_ALL
    push offset FileNameTo
    call CreateFile
    mov hFile, eax


    push 0
    push offset BWritten
    push newfiletext     
    push offset pMemory 
    push hFile
    call WriteFile    


    invoke GlobalUnlock, pMemory
    invoke GlobalFree, hMemory
    invoke CloseHandle, hFile

end start

我想做的是打开一个现有文件 (file1),然后读取内容,创建另一个文件 (file2),然后将文本从 file1 复制到 file2。我可以创建 file2.txt 但是当我打开它时,它是空白的。

您对 WriteFile 的调用出错:

push offset pMemory   <-- The offset operator shouldn't be used here
push hFile
call WriteFile    

此外,不要使用 GENERIC_ALL。使用您需要的最少访问权限,例如GENERIC_WRITEGENERIC_READ OR GENERIC_WRITE。使用 GENERIC_ALL 时,您可能会请求当前用户没有权限的访问权限。


让我们为您的代码添加一些错误检查:

include \masm32\include\msvcrt.inc
includelib  \masm32\lib\msvcrt.lib

...

szErrMsg db "GetLastError: %x",13,10,0

...
push GENERIC_ALL
push offset FileNameTo
call CreateFileA
mov hFile, eax

cmp eax,INVALID_HANDLE_VALUE
jne open_ok
invoke GetLastError
invoke crt_printf,addr szErrMsg,eax
open_ok:

现在 运行 程序在控制台中为我们提供了输出 GetLastError: 5。谷歌搜索 "getlasterror codes" 得到 this page,我们发现 5 表示 ERROR_ACCESS_DENIED.