汇编程序中的两个堆栈?

时间:2016-06-19 11:32:06

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

我在8086汇编程序中编码,我遇到了一个有趣的问题。主题是评估括号。如果这是JavaC中的问题,我只需定义两个堆栈 - 一个用于数字,另一个用于操作数。我可以在Assembly做类似的事吗? 据我所知,堆栈是在数据段的最后一个存储单元中定义的。如果我定义另一个数据段,我还有另一个可用的堆栈吗?

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

谢谢!

2 个答案:

答案 0 :(得分:2)

  

据我所知,堆栈在数据段的最后一个存储单元中是不同的

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

  

如果我要另外一个数据段,我还有另一个可用的堆栈吗?

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

答案 1 :(得分:0)

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

如果您要小心检查输入中的语法错误是否导致程序崩溃,则可以使用call stacksp)作为其中之一。{p> (例如,将bpsp进行比较,以检测您何时清空了您在调用堆栈中存储的堆栈数据结构。

不要将sp更改为指向其他堆栈数据结构;使用不同的寄存器(如si)来访问它。

您可以使用lodsw弹出ax(方向标志设置适合您的堆栈增长方向)。或者使用stosw将ax推到di指向的堆栈上。但由于它们使用不同的索引寄存器,因此不值得(特别是不能一直改变方向标志)。

因此,对于第二个堆栈数据结构,只需使用正常的mov加载/存储和add/subb si, 2

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