【问题标题】:Assembly function basics?装配功能基础?
【发布时间】:2013-02-07 06:55:15
【问题描述】:

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

【问题讨论】:

    标签: function assembly stack


    【解决方案1】:

    如果您知道列表/数组中有多少元素,您可以在该函数中(使用 C 的 malloc() 或等效的)或在它之外(再次使用 @ 987654322@ 或将数组/列表声明为一个变量或一组相互引用的变量)并将列表/数组的第一个元素的地址传递给函数。

    或者,您可以在函数中逐个元素构建列表/数组,并从中返回第一个元素的地址。自然,您需要分配第一个元素,然后增加分配以便为后续元素留出一些空间(使用 C 的 realloc()),或者您可以单独分配所有元素(使用 C 的 malloc())并将它们链接起来(即, 元素需要包含一个指针/地址,以便将它们链接到一个列表中。

    【讨论】:

      【解决方案2】:

      我将假设“列表”是指“数组”。如果要返回指向数字数组的指针,则需要为该数组分配一些内存。要么让调用者传入它,要么调用malloc 来分配一个缓冲区——它对汇编程序和C 程序一样有效。最后,返回指向eax中的数组的指针。

      【讨论】:

      • 谢谢,我想我没有想过做我会在 C 中做的同样的事情。...汇编 -.-
      【解决方案3】:

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

      【讨论】:

      • 所以你是说我可以返回一个内存索引,该索引将指向我在堆栈上的函数中创建的变量而不使用堆?
      • @Jack - 不,那会很危险。如果你调用一些其他函数来修改堆栈上的这些变量怎么办?
      • 不,它必须是堆内存索引,否则可能会被覆盖(同样的原因,您不能在 C++ 中返回指向堆栈对象的指针)。但是,如果您的调用函数在堆栈上分配内存,您可以安全地将该索引传递给函数。权衡是调用函数需要提前知道(或猜测)要分配多少内存。
      • 谢谢大家。现在这是有道理的。
      猜你喜欢
      • 2013-10-28
      • 2016-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多