【发布时间】:2016-12-29 02:06:27
【问题描述】:
我尝试使用 NASM 调用 WriteConsoleOutputA
但总是显示错误信息
87 (0x57)
参数不正确。
我不知道如何解决这个问题
STD_OUTPUT_HANDLE EQU -11
NULL EQU 0
GLOBAL GobleyGook
EXTERN ExitProcess, GetLastError, GetStdHandle, WriteConsoleA, WriteConsoleOutputA, FormatMessageA
SECTION .data
STRUC lpBuffer
.Char : RESW 1
.Attributes: RESD 1
ENDSTRUC
_lpBuffer ISTRUC lpBuffer
at lpBuffer.Char, DW 'A'
at lpBuffer.Attributes, DD 1H
IEND
STRUC dwBufferSize
.X: RESW 1
.Y: RESW 1
ENDSTRUC
_dwBufferSize ISTRUC dwBufferSize
at dwBufferSize.X, DW 10
at dwBufferSize.Y, DW 10
IEND
STRUC dwBufferCoord
.X: RESW 1
.Y: RESW 1
ENDSTRUC
_dwBufferCoord ISTRUC dwBufferCoord
at dwBufferCoord.X, DW 0
at dwBufferCoord.Y, DW 0
IEND
STRUC smallRect
.Left : RESW 1
.Top : RESW 1
.Right : RESW 1
.Bottom: RESW 1
ENDSTRUC
_smallRect ISTRUC smallRect
IEND
SECTION .bss
dummy RESD 1
err RESD 1
err2 RESD 1
SECTION .text
GobleyGook:
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle
PUSH _smallRect
PUSH _dwBufferCoord
PUSH _dwBufferSize
PUSH _lpBuffer
PUSH EAX
CALL WriteConsoleOutputA
CALL GetLastError
PUSH NULL
PUSH 99
PUSH err
PUSH NULL
PUSH EAX
PUSH NULL
PUSH 1000H
CALL FormatMessageA
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle
push NULL
push dummy
push 32
push err
push EAX
call WriteConsoleA
PUSH NULL
CALL ExitProcess
链接和编译器
nasm -f win32 print.asm
golink.exe /console /entry GobleyGook print.obj kernel32.dll
在 windows 8.1 64bit 上
API 文档
https://msdn.microsoft.com/zh-tw/library/windows/desktop/ms687404(v=vs.85).aspx
请帮帮我....
【问题讨论】:
-
我想知道您是否需要将坐标参数作为
DWORD而不是作为指向结构的指针传递;如果是这样的话,我不完全知道为什么(我只知道某些结构需要它,比如BLENDFUNCTION)。 -
我同意@andlabs。文档显示
dwBufferSize和dwBufferCoord按值传递,而不是通过指针传递。 -
我尝试直接push 10(size)和push 0(Coord),显示同样的错误信息...
-
您是否尝试过查看 C 编译器输出以进行相同的函数调用?
-
是的,我尝试了 C++ 版本...成功