通过中间函数调用WriteConsole无法正常工作
Calling WriteConsole through an intermediate function does not work properly
我正在尝试学习assembly
,所以我手动将C
和C++
代码转换为assembly
代码。
环境
-
x86
-
Visual Studio
目标
手动将以下C
代码转换为assembly
代码:
static HANDLE OUTPUT_HANDLE;
BOOL __stdcall InputConsole(const VOID *lpBuffer, DWORD nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten)
{
WriteConsoleA(OUTPUT_HANDLE, lpBuffer, nNumberOfCharsToWrite, lpNumberOfCharsWritten, 0);
}
int main()
{
DWORD charsWritten;
OUTPUT_HANDLE = GetStdHandle(STD_OUTPUT_HANDLE);
InputConsole("Hello World!n", 13, &charsWritten);
}
尝试
.586
.model flat, stdcall
.stack 4096
EXTRN ExitProcess@4 : PROC
EXTRN GetStdHandle@4 : PROC
EXTRN WriteConsoleA@20 : PROC
.data
STD_OUTPUT_HANDLE DD ?
WRITE_CONSOLE_STRING DB "Hello World!", 10, 0
CHARS_WRITTEN DD ?
.code
WriteConsole PROC
PUSH 0 ; lpReserved
MOV EAX, [ESP + 16] ; lpNumberOfCharsWritten
PUSH EAX
MOV EAX, [ESP + 16] ; nNumberOfCharsToWrite
PUSH EAX
MOV EAX, [ESP + 16] ; lpBuffer
PUSH EAX
PUSH STD_OUTPUT_HANDLE ; hConsoleOutput
CALL WriteConsoleA@20
ADD ESP, 12 ; Restore stack
RET
WriteConsole ENDP
main: NOP
PUSH -11
CALL GetStdHandle@4;
MOV STD_OUTPUT_HANDLE, EAX
LEA EAX, CHARS_WRITTEN
PUSH EAX
PUSH 13
LEA EAX, WRITE_CONSOLE_STRING
PUSH EAX
CALL WriteConsole
PUSH 0
CALL ExitProcess@4
END main
问题
到目前为止,它确实打印了实际的行,但是在ADD ESP, 12
处抛出了Access Violation Exception
。经过调试器的仔细检查,我似乎应该将16
而不是12
添加到ESP中以恢复堆栈。仍然在使其成为16
之后,它在应用程序从procedure
返回之后冻结该应用程序。
问题
- 为什么我需要添加
16
而不是12
,而我只在堆栈上推送三个4字节的参数 - 使用
ESP + xx
访问"输入参数"是否正确 - 为什么我的程序会冻结,即使我正在恢复堆栈,而且控制台上确实写了一些东西
- 有没有其他方法可以在
assembly
中"通过引用传递参数",而不是使用全局.data
地址
旁注
我知道你可以在Visual Studio(我正在使用的IDE)中为过程设置参数,但根据我的操作方式,这应该是可能的,对吧?
您没有';Don’不要用add esp
那样做,你用ret 12
那样做。–nbsp;Jester
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程