初始化C ++输入/输出流以进行汇编编程

时间:2018-12-22 03:43:54

标签: nasm

这是我在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无效?

1 个答案:

答案 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 << "";之后。