2013-02-21 56 views
1

我需要一些帮助来理解组装中的某些功能。我可以创建一个简单的函数,它接受一个参数或2,然后通过将它放入一个寄存器%eax来返回类似于数字的内容。我的问题是你如何返回一个列表?我正在创建一个函数,它将搜索可能为100个数字的已定义数据集,并且我需要继续运行特定范围(0-9,10-19,20-29等)中的数字总数,以便将一个变量为每个范围。由于寄存器的数量是有限的,所以我显然必须通过调整堆栈来创建局部变量的空间,而不是。但是,如何返回所有这些值?我会假设你会返回一个地址在%eax指向这些变量的位置,但由于这些值是本地的,并在堆栈上创建,我不会无法访问这些?我的意思是我猜你可以,但是这违背了我对局部变量及其范围的所有知识。这些价值观应该放在堆上还是什么东西?我没有教过任何涉及堆的任何东西,所以我不知道这是我应该做什么,或者我不了解某些东西......?任何帮助表示赞赏。谢谢。装配功能基础?

回答

0

如果你知道如何列表/数组中的许多元素,更将是,你可以分配内存,要么在功能(使用C++的malloc()或等价物)或它(外面再使用malloc()或将数组/列表声明为一个变量或一组相互引用的变量),并将函数传递给列表/数组的第一个元素的地址。

或者,你可以在函数中通过元素生成列表/数组元素,并从它返回的第一个元素的地址。当然,你需要分配的第一要素,然后成长的分配有一定的空间,后续元素(用C的realloc()),也可以单独分配的所有元素(用C的malloc()),并把它们连(即元素会需要包含一个指针/地址以将它们链接到列表中)。

0

我要去“清单”那你的意思是“数组”的假设。如果你想返回一个指向数组数组的指针,你需要为该数组分配一些内存。要么调用者通过它,要么调用malloc来分配一个缓冲区 - 它对于程序集和C程序一样好。最后,将指针返回到eax中的数组。

+0

谢谢,我想我没有想到这样做我会在C做同样的事的...... -.-装配 – zProgrammer 2013-02-21 20:07:40

0

您返回内存指数在堆上创建的列表。或者你将它传递给存储器索引以将数据写入为参数,并将其用作输出变量。那么内存索引可以是堆栈或堆的。

+0

所以你说我可以返回一个内存索引将指向我创建的变量在栈上的函数没有使用堆? – zProgrammer 2013-02-21 19:55:36

+0

@杰克 - 不,那会非常危险。如果你调用一些其他函数来修改堆栈中的这些变量呢? – 2013-02-21 19:57:22

+0

不,它必须是一个堆内存索引,否则它可能会被覆盖(同样的原因,你不能在C++中返回一个指向堆栈对象的指针)。但是,如果您的调用函数在堆栈中分配内存,则可以安全地将该索引传递给该函数。这里的折衷是调用函数需要知道(或猜测)提前分配多少内存。 – 2013-02-21 19:57:26