【发布时间】:2011-05-03 13:12:03
【问题描述】:
例如,我使用一些汇编代码将大量数据压入堆栈。我的问题是,是否可以通过将堆栈指针的地址传递给 c++ 程序(或其他方式)来使用诸如 c++ 之类的语言来操作这些数据?如果是这样,c++ 将如何处理这些数据?意思是,我将如何确定 C++ 中的数据类型?
【问题讨论】:
-
我会说不要使用堆栈进行“通信”。为此使用通常的参数传递/内存。
例如,我使用一些汇编代码将大量数据压入堆栈。我的问题是,是否可以通过将堆栈指针的地址传递给 c++ 程序(或其他方式)来使用诸如 c++ 之类的语言来操作这些数据?如果是这样,c++ 将如何处理这些数据?意思是,我将如何确定 C++ 中的数据类型?
【问题讨论】:
我相信它也需要在同一个进程中运行。但是你不能在 c++ 中键入一个结构来确定数据类型,并在你放入堆栈的信息中附加一个标头,指示数据的布局方式。
【讨论】:
是的,您可以这样做,当然前提是您正确使用调用约定,这样数据就可以完全清除 C++ 代码用作堆栈的堆栈的任何区域。堆栈内存只是内存,就接收此指针的代码而言,将某些值压入堆栈或移动堆栈指针(即在堆栈上创建数组/结构)然后写入值没有区别放入您创建的空间中,或者只是动态分配一些内存并将值放入其中。您的汇编程序推送指令将值放入某个特定的布局中。
您无法确定数据类型。例如,在 x86 上,并排的两个 32 位 int 值与一个 64 位 long long 值完全相同。这就是为什么调用约定指定参数在堆栈上的布局,并要求调用者和被调用者都知道(并同意)参数的顺序和类型。
当然,您可以提供额外的信息,让被调用者计算出数据类型。例如,printf 的第一个参数是(指向)格式字符串,通过解析格式字符串,被调用者知道此特定调用的剩余参数的类型,然后可以使用可变参数读取它们宏。
【讨论】: