64位程序 – Windows“影子空间”的麻烦

我正在尝试用x64汇编语言创build一个程序,但是我在理解x64调用约定时遇到了问题。 我相信问题在于我不知道为了调用CopyFile函数我必须预留多less阴影空间。 当我运行程序时,它只是崩溃。 我使用MASM创build了这个程序。 请帮我解决这个代码。 谢谢。

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 

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

相反,你的错误在于错误地获取字符串的地址。 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', \ GetmoduleeFileNameA,'GetmoduleeFileNameA', \ ExitProcess,'ExitProcess', \ CopyFileA,'CopyFileA' import user32, \ MessageBoxA,'MessageBoxA'