【问题标题】:Question about "push" and the stack关于“推”和堆栈的问题
【发布时间】:2011-01-09 02:43:55
【问题描述】:

如果您将某个东西多次压入堆栈(例如在循环中),堆栈是继续增长还是之前的值被替换?例如,重复推送 EDI 5 次。堆栈会有 5 个 EDI 吗?

【问题讨论】:

    标签: assembly stack push


    【解决方案1】:

    堆栈不断增长,直到达到某个操作系统定义的限制。然后抛出异常。此限制在 PC 上通常为 256k 甚至兆字节,以允许递归。

    堆栈不保存类型,所以由于 EDI 是一个 32 位寄存器,5 次 push edi 后它将包含 5 个 32 位值,与 EDI 中的值相同

    【讨论】:

      【解决方案2】:

      堆栈是否不断增长

      是的。这就是为什么它被称为“堆栈”。这是一个非常基本的属性,因为它允许递归调用(子例程使用不同的参数调用自身)。

      【讨论】:

        【解决方案3】:

        什么都没有生长。每次推送内容时,堆栈指针寄存器都会简单地递增(或递减,具体取决于 CPU 架构),因此它指向一个新的但现有的内存位置。

        这通常被称为堆栈“增长”,但实际上与 C 中所说的一样:

        int stack[100];
        int sp = 0;
        stack[sp++] = 42; // push
        

        CPU 堆栈,就像上面的数组一样,是固定大小的,当它耗尽时,会发生某种错误(再次取决于架构)。

        【讨论】:

          猜你喜欢
          • 2011-01-23
          • 2023-03-05
          • 2021-10-30
          • 2011-11-28
          • 1970-01-01
          • 2016-03-24
          • 2016-10-04
          • 2020-08-03
          • 2021-04-13
          相关资源
          最近更新 更多