1

我正在尝试用 x64 汇编语言创建一个程序,但我在理解 x64 调用约定时遇到了问题。我认为问题在于我不知道必须为调用 CopyFile 函数保留多少影子空间。当我运行程序时,它会崩溃。我使用 MASM 创建了这个程序。请帮我修复此代码。谢谢你。

includelib \Masm64\Lib\Kernel32.lib
includelib \Masm64\Lib\User32.lib
extrn GetProcessHeap : proc
extrn MessageBoxA : proc
extrn HeapAlloc : proc
extrn GetModuleFileNameA : proc
extrn ExitProcess : proc
extrn CopyFileA : proc

dseg segment para 'DATA'
file db 'C:\CopyThisFile.txt', 0
file2 db 'C:\ThisFileWasCopied.txt', 0
succ db 'Success!', 0
capt db 'Debug', 0
dseg ends

cseg segment para 'CODE'
start proc
sub rsp, 28h
xor r8, r8
mov rdx, qword ptr file2
mov rcx, qword ptr file
call CopyFileA
xor ecx, ecx 
call ExitProcess
start endp
cseg ends
end
4

1 回答 1

1

这与堆栈上的空间预留无关。

相反,您的错误在于错误地获取了字符串的地址。mov获取内容(前 8 个字节)而不是指向字符串的指针,因此引发 AccessViolation 异常。要解决此问题,请使用lea.

format PE64 GUI 5.0
entry start

include 'WIN64A.INC'

section '.data' data readable writeable

    fileStr db 'C:\\CopyThisFile.txt', 0
    file2Str db 'C:\\ThisFileWasCopied.txt', 0
    succ db 'Success!', 0

section '.text' code readable executable

    start:

    sub rsp, 28
    xor r8, r8
    lea rdx, qword ptr file2Str
    lea rcx, qword ptr fileStr
    call [CopyFileA]
    xor ecx, ecx
    call [ExitProcess]

section '.idata' import data readable

    library kernel32,'kernel32.dll',user32,'user32.dll'

    import kernel32, \
        GetProcessHeap,'GetProcessHeap', \
        HeapAlloc,'HeapAlloc', \
        GetModuleFileNameA,'GetModuleFileNameA', \
        ExitProcess,'ExitProcess', \
        CopyFileA,'CopyFileA'

    import user32, \
        MessageBoxA,'MessageBoxA'
于 2013-06-26T12:36:35.223 回答