【发布时间】:2019-08-02 09:48:35
【问题描述】:
我正在尝试学习如何使用 windows api(而不仅仅是使用 C 调用、irvine32 或 masm32)并且遇到了 ReadConsoleInputA 的问题(WriteConsoleA 工作正常)。
另外,我不明白为什么在函数的 PROC 原型中,大多数示例在 ReadConsoleInput/WriteConsole 的末尾附加了 A 或 W,你能解释一下原因吗?
.data
consoleOutHandle dd ?
consoleInHandle dd ?
bufferlen dd ?
buffer db ?
bufferSize DWORD ?
message db "Enter a number:", 0
lmessage equ $-message
.code
main PROC
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov consoleOutHandle, eax
invoke ReadConsoleInputA, consoleOutHandle, offset buffer, 128, bufferSize
main endp
end main
它抛出:访问冲突写入位置0x00000004。
按照 Michael Petch 的建议,我现在有了以下代码:
.data
consoleOutHandle dd ?
consoleInHandle dd ?
byteswritten dd ?
bufferlen dd ?
buffer db 128 DUP(?)
bufferSize dd ?
message db "Enter a number:", 0
lmessage equ $-message
.code
main PROC
invoke GetStdHandle, STD_INPUT_HANDLE
mov consoleInHandle, eax
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov consoleOutHandle, eax
mov eax, lmessage
invoke WriteConsoleA, consoleOutHandle, offset message, eax, bytesWritten, 0
invoke ReadConsoleInputA, consoleInHandle, offset buffer, 128, offset bufferSize
main endp
end main
现在它抛出“触发断点”。
反汇编:
invoke ReadConsoleInputA, consoleInHandle, offset buffer, 128, offset bufferSize
00E71066 push offset bufferSize (0E74090h)
00E7106B push 80h
00E71070 push offset buffer (0E74010h)
00E71075 push dword ptr [consoleInHandle (0E74004h)]
00E7107B call _ReadConsoleInputA@16 (0E7100Ah)
--- No source file -------------------------------------------------------------
00E71080 int 3 **---> Breakpoint here**
00E71081 int 3
【问题讨论】:
-
做到了,但现在它“触发了断点”。我过去曾尝试过您的建议,但我不断收到“触发断点”或“访问冲突”。
-
是的,我已根据您的建议更新了原始帖子。感谢您的链接(A&W)
-
@MichaelPetch:这有点太强了。修复一个明显且无趣的错误(例如未能保留足够空间)似乎是一个好主意,但它并不是问题的全部。之前出现过很多这样的问题。我建议 OP 至少应该添加一个带有更改版本的第二个代码块(以及一个带有反汇编的代码块,因为 cmets 没有格式)。
-
但是无论如何,现在这个错误只是缺少
ret,导致函数的末尾掉入int3填充,MASM和/或链接器正是出于这个原因在函数之间放置的.至少有几个关于函数结束的问题,但可能没有 MASM 遇到int3。 -
谢谢,我已遵循您的建议并将该信息附加到问题中。
标签: windows winapi assembly x86 masm