这是我在NASM中完全编写的Win32 C ++程序的完整源代码:
http://devel.archefire.org/tmp/01_00.cpp.zip
我想与Windows的C ++函数(MSVCIRT.DLL)交互。
我试图运行这样的程序来打印字符串:
#include <iostream.h>
void main()
{
cout <<"Welcome to Programming in C++";
}
当我将其翻译为NASM时,cout不会打印任何内容:
push wideword main_printf_str_1
mov widecx,?cout@@3Vostream_withassign@@A@MSVCIRT.DLL
call wideword[??6ostream@@QAEAAV0@PBD@Z@MSVCIRT.DLL]
所以我想我需要对输入/输出流以及标准的“基本”类进行初始化,类似于使用MSVCRT.DLL中的__p_iob初始化stdin,stdout,stderr时所进行的操作。
我需要调用哪些C ++函数来获取在程序集中调用ostream时将打印的初始化cout,或者为什么上面的程序集不打印任何内容,好像cout无效?
答案 0 :(得分:0)
http://devel.archefire.org/tmp/01_00.cpp.zip
我终于解决了这个问题。
为了能够与cout << "";
输出,我发现需要调用以下2个MSVCIRT.DLL
引用:
push wideword main_printf_str_1
mov widecx,[?cout@@3Vostream_withassign@@A@MSVCIRT.DLL]
call wideword[??6ostream@@QAEAAV0@PBD@Z@MSVCIRT.DLL]
然后,在结束程序之前,我们需要从exit(int );
调用MSVCRT.DLL
。这将刷新cout
的输出。
也许可以使用形式上的刷新,但是Visual C ++ 6.0从exit(int )
返回后会强制执行最终的刷新操作,而生成的代码以对main()
的调用结尾,并且不会显式刷新任何内容在cout << "";
之后。