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
我在使用以下代码片段时遇到问题。 我正在使用 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