【问题标题】:stack data between languages在语言之间堆叠数据
【发布时间】:2011-05-03 13:12:03
【问题描述】:

例如,我使用一些汇编代码将大量数据压入堆栈。我的问题是,是否可以通过将堆栈指针的地址传递给 c++ 程序(或其他方式)来使用诸如 c++ 之类的语言来操作这些数据?如果是这样,c++ 将如何处理这些数据?意思是,我将如何确定 C++ 中的数据类型?

【问题讨论】:

  • 我会说不要使用堆栈进行“通信”。为此使用通常的参数传递/内存。

标签: c++ assembly types stack


【解决方案1】:

我相信它也需要在同一个进程中运行。但是你不能在 c++ 中键入一个结构来确定数据类型,并在你放入堆栈的信息中附加一个标头,指示数据的布局方式。

【讨论】:

  • 是的,如果我要通过堆栈传递这些数据,我很可能会有一个需要推送的正式格式,并且 c++ 程序会读取它,在那个格式。
【解决方案2】:

是的,您可以这样做,当然前提是您正确使用调用约定,这样数据就可以完全清除 C++ 代码用作堆栈的堆栈的任何区域。堆栈内存只是内存,就接收此指针的代码而言,将某些值压入堆栈或移动堆栈指针(即在堆栈上创建数组/结构)然后写入值没有区别放入您创建的空间中,或者只是动态分配一些内存并将值放入其中。您的汇编程序推送指令将值放入某个特定的布局中。

您无法确定数据类型。例如,在 x86 上,并排的两个 32 位 int 值与一个 64 位 long long完全相同。这就是为什么调用约定指定参数在堆栈上的布局,并要求调用者和被调用者都知道(并同意)参数的顺序和类型。

当然,您可以提供额外的信息,让被调用者计算出数据类型。例如,printf 的第一个参数是(指向)格式字符串,通过解析格式字符串,被调用者知道此特定调用的剩余参数的类型,然后可以使用可变参数读取它们宏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2019-10-28
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多