2010-11-01 102 views
1

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

+2

我会说不要使用堆栈来进行“通信”。使用通常的参数传递/内存。 – 2010-11-01 17:27:31

回答

4

是的,你可以做到这一点,当然你必须正确使用调用约定,以便数据清楚地表明C++代码使用堆栈的任何区域。堆栈内存只是内存,就接收这个指针的代码而言,将一些值推入堆栈或移动堆栈指针(即在堆栈上创建一个数组/结构)并写入值进入你创建的空间,或者只是动态地分配一些内存并将值放入。你的汇编程序推送指令将值放在某个特定的布局中。

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

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

2

我相信它都需要在同一个过程中运行。但是,难道你不能只是在C++中键入一个结构来确定数据类型,并且将一个头添加到你放入堆栈的信息中,以指示数据的布局方式。

+0

是的,而且如果我要通过堆栈传递这些数据,很可能会有一种正式格式需要推送,并且C++程序会以此格式读取它。 – 2010-11-01 17:48:52