【问题标题】:Initialize C++ input/output streams for programming in assembly初始化 C++ 输入/输出流以进行汇编编程
【发布时间】:2018-12-22 03:43:53
【问题描述】:

这是我用 NASM 完全编写的 Win32 C++ 程序的完整源代码:
http://devel.archefire.org/tmp/01_00.cpp.zip

我想与 Windows (MSVCIRT.DLL) 中的 C++ 函数进行交互。

我曾尝试运行这样的程序来打印字符串:

#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 无效一样?

【问题讨论】:

  • 你为什么要用简单的汇编语言来做呢?
  • std::cout 已经存在。如果您想获得原始输出,只需使用stream.write
  • 我需要学习从普通程序集连接 C++ 环境以获得更好的可移植性,剥离未使用的代码,了解使用不同实现(GCC、MSVC、Open Watcom 等)的 C++ 代码的实际结构。 )。这只是知道如何初始化默认流和其他东西的问题。

标签: nasm


【解决方案1】:

http://devel.archefire.org/tmp/01_00.cpp.zip

我终于解决了这个问题。

为了能够用cout &lt;&lt; "";输出,我发现需要调用以下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]

然后,在结束程序之前,我们需要从MSVCRT.DLL 调用exit(int );。这将刷新cout 的输出。

可能会使用正式刷新,但 Visual C++ 6.0 生成的代码在从 main() 返回后以调用 exit(int ) 结束,以强制执行类似最终刷新的操作,并且在 @987654330 之后不会显式刷新任何内容@。

【讨论】:

    猜你喜欢
    • 2015-02-23
    • 2021-11-22
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多