Function 每个使用Win32 API的汇编程序';s的打印功能在启动时崩溃。我怎样才能解决这个问题?

Function 每个使用Win32 API的汇编程序';s的打印功能在启动时崩溃。我怎样才能解决这个问题?,function,assembly,binary,call,Function,Assembly,Binary,Call,最近我试着在Win32二进制文件上乱搞(这是为了我的一个大项目)。 因此,经过几周的研究,我现在对汇编如何工作、如何将其转换为二进制代码以及x86/x64操作码如何工作有了坚实的理解 谜题的最后一部分是找出如何正确调用Win32 API方法。 实际上,我在这里问了一个与此相关的问题,我得到的答案是,我应该尝试编译一个汇编程序或C程序来实现这一点。所以我继续在汇编中尝试了这一点(顺便说一下,我正在使用FASM): 实际上,这是该代码的众多版本之一。主要的问题是,当我调用诸如“ExitProcess

最近我试着在Win32二进制文件上乱搞(这是为了我的一个大项目)。 因此,经过几周的研究,我现在对汇编如何工作、如何将其转换为二进制代码以及x86/x64操作码如何工作有了坚实的理解

谜题的最后一部分是找出如何正确调用Win32 API方法。 实际上,我在这里问了一个与此相关的问题,我得到的答案是,我应该尝试编译一个汇编程序或C程序来实现这一点。所以我继续在汇编中尝试了这一点(顺便说一下,我正在使用FASM):

实际上,这是该代码的众多版本之一。主要的问题是,当我调用诸如“ExitProcess”之类的方法时,通常是从kernel32.dll库调用其他函数,事情似乎都解决了。是IO函数让我感到困扰

我不明白这段代码出了什么问题,我没有得到任何编译时错误,尽管当我运行它时,它只是崩溃了

所以我的下一个想法是,既然这不起作用,在C中尝试同样的方法。 我正在使用Cygwin作为编译器和链接器

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MessageBox(NULL, "Hello, world!", "Test", MB_OK);
    return 0;
}
#包括
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、LPSTR lpCmdLine、int nCmdShow){
MessageBox(空,“你好,世界!”,“测试”,MB_OK);
返回0;
}
这段代码产生了相同的结果,应用程序崩溃了

现在,我不寻找任何C/C++代码。我最初感兴趣的问题是了解在x86/x64二进制(汇编)代码中调用extern库函数是什么样子。但我非常感谢您提供有关此主题的任何资源

先谢谢你


-Tom S.

您的问题是需要在结束时调用
ExitProcess
,以正确结束流程。由于您没有这样做,代码当前将继续执行,并最终分段出错,因为它试图执行垃圾字节。

您的问题是,您需要在结束时调用
ExitProcess
,以正确结束进程。由于您没有这样做,代码当前将继续执行,并最终会出现故障,因为它试图执行垃圾字节。

实际上,
ExitProcess
不是必需的-您可以从入口点返回。谢谢!对于汇编代码,这实际上是可行的。但我不明白为什么C代码终究不能工作。我的意思是,我从初学者教程中获取了这段代码。我看不出C代码崩溃的原因。除非字符集现在定义为Unicode?实际上,
ExitProcess
不是必需的-您可以从入口点返回。谢谢!对于汇编代码,这实际上是可行的。但我不明白为什么C代码终究不能工作。我的意思是,我从初学者教程中获取了这段代码。我看不出C代码崩溃的原因。除非字符集现在定义为Unicode?
#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MessageBox(NULL, "Hello, world!", "Test", MB_OK);
    return 0;
}