【问题标题】:Two Stacks in Assembler?汇编器中有两个堆栈?
【发布时间】:2016-10-20 18:40:43
【问题描述】:

我正在使用 8086 汇编器进行编码,但遇到了一个有趣的问题。主题是评估括号。如果这是Java 或C 中的一个问题,我会简单地定义两个堆栈——一个用于数字,另一个用于操作数。我可以在Assembly 中做类似的事情吗? 据我所知,堆栈是在数据段的最后一个内存单元中定义的。如果我定义另一个数据段,我会有另一个可用的堆栈吗?

另一个信息:我不知道一开始的输入大小,我应该让程序尽可能高效。

谢谢!

【问题讨论】:

    标签: assembly stack x86-16 parentheses data-segment


    【解决方案1】:

    所以你想使用两个stack data structures 来评估像((a+b) + (c)) 这样的表达式?

    如果您仔细检查输入中的语法错误不会导致程序崩溃,您可以将call stack (sp) 用于其中之一。 (例如,比较 bp 和 sp 以检测您何时清空了存储在调用堆栈中的堆栈数据结构)。

    不要把sp改成指向另一个栈数据结构;使用不同的寄存器(如si)来访问它。

    您可以使用lodsw 弹出到 ax 中(方向标志设置为适合您的堆栈增长方向)。或者使用stosw 将 ax 推送到di 指向的堆栈上。但是由于它们使用不同的变址寄存器,所以不值得(尤其是不要一直改变方向标志)。

    所以对于第二个堆栈数据结构,只要适当地使用普通的movloads/stores 和add/subb si, 2。

    如果将其中一个堆栈保留在调用堆栈 (sp) 上证明不方便,那么也不要这样做。

    【讨论】:

      【解决方案2】:

      据我所知,堆栈是在数据段的最后一个内存单元中定义的

      如果您正在开发一个 .COM 风格的程序,其中所有段寄存器都具有相同的值,并且 DOS 将堆栈指针放置在这 64KB 内存的高端,这是正确的。

      如果我要定义另一个数据段,我会有另一个可用的堆栈吗?

      无需更改 数据段 即可拥有另一个堆栈。更改 SS:SP 寄存器对并开始使用新定义的堆栈。
      堆栈从SP 开始向下延伸。所以如果你有 SP=4096 那么堆栈将是 4096 字节。 (不算环绕,这可能是错误的)

      【讨论】:

      • 谢谢。比这应该工作吗? stack 100h push ax push bx ... mov ax, ss mov bx, sp mov ss, 0f00h mov sp, 0f00h 而且我在 ax:bx 中有一个堆栈,在 ss:sp 中有另一个堆栈?
      • 一次只能有 1 个处于活动状态的堆栈:使用 SS:SP 定义的堆栈。您可以设置第二个内存区域用于堆叠,但您需要在 SS:SP 对中加载指向该区域的完整指针。
      • 也不存在像mov ss, 0f00h 这样的指令!您不能在段寄存器中移动立即值(数字)。
      • 谢谢。就我而言,我需要一次将数据推送到两个堆栈。这意味着我必须为每个堆栈都有一个指针,对吗?否则我会溢出堆栈中的数据,因为我每次都将 sp 返回到同一点...
      • 正确。因为它是你最好的 3 个堆栈!一个用于数字,一个用于操作数,一个用于普通堆叠项,例如call、ret、int、 ...
      猜你喜欢
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多