MASM 控制台 window 创建问题(也许是我的堆栈框架??)

MASM console window creation troubles (maybe my stack frame??)

我在使用以下代码片段时遇到问题。 我正在使用 visual studio express 2012 编译一个带有 c++ 文件的 asm 文件。

我试过调试计算堆栈指针和内存位置的地址(显然还在学习汇编),但找不到错误。 (因为我是新手,这可能很明显,但还不够明显)。 asm 部分只是一个从 c++ 文件调用的函数,它应该打开一个控制台 window 并在其中打印一些东西。 SetConsoleTitleA 工作正常,它在 Writefile 函数上跳闸。这是错误本身:

First-chance exception at 0x00007FF8551A5B48 (KernelBase.dll) in
Troy2.exe: 0xC0000005: Access violation writing location 

0x00007FF700000000.
    Unhandled exception at 0x00007FF8551A5B48 (KernelBase.dll) in Troy2.exe: 
0xC0000005: 
    Access violation writing location 0x00007FF700000000.

代码在这里:

extrn GetStdHandle: PROC
extrn WriteFile: PROC
extrn AllocConsole: PROC
extrn FreeConsole: PROC
extrn SetConsoleTitleA: PROC
extrn SetConsoleCursorPosition: PROC
extrn Sleep: PROC
extrn ExitProcess: PROC
extrn MessageBoxA:PROC

.data
consoletitle db 'Console', 0
prompt db 'Oronco-> ', 0
handle dd ?

.code

myfunction proc
    call AllocConsole
    sub rsp, 20h
    lea rcx, consoletitle
    call SetConsoleTitleA
    add rsp, 20h

    sub rsp, 20h
    mov rcx, -11
    call GetStdHandle
    add rsp, 20h

    mov handle, eax

    sub rsp, 28h
    lea rcx, handle
    lea rdx, prompt
    mov r8, SIZEOF prompt
    mov r9, 0
    mov dword ptr [rsp + 20h], 0
    call WriteFile
    add rsp, 28h
    mov rcx, 2000
    call Sleep

    Call ExitProcess
myfunction endp
End
mov dword ptr [rsp + 20h], 0

错了。最后一个参数的类型为 LPOVERLAPPED,此处为 64 位指针。将行更改为

mov qword ptr [rsp + 20h], 0

此外,

lea rcx, handle

错了。 WriteFile 需要一个值,而不是地址(指针)。改成

mov ecx, handle