我在8086汇编程序中编码,我遇到了一个有趣的问题。主题是评估括号。如果这是Java
或C
中的问题,我只需定义两个堆栈 - 一个用于数字,另一个用于操作数。我可以在Assembly
做类似的事吗?
据我所知,堆栈是在数据段的最后一个存储单元中定义的。如果我定义另一个数据段,我还有另一个可用的堆栈吗?
另一个信息:我一开始并不知道输入的大小,我应该尽可能提高程序的效率。
谢谢!
答案 0 :(得分:2)
据我所知,堆栈在数据段的最后一个存储单元中是不同的
如果您正在开发一个.COM样式程序,其中所有段寄存器具有相同的值,并且DOS将堆栈指针放在此64KB内存的高端,那么这是正确的。
如果我要另外一个数据段,我还有另一个可用的堆栈吗?
无需将数据段更改为另一个堆栈。更改SS:SP寄存器对并开始使用新定义的堆栈
堆栈从SP
开始向下延伸。所以如果你有SP = 4096那么堆栈将是4096字节。 (不计算可能会出错的环绕声)
答案 1 :(得分:0)
所以你想用两个stack data structures来评估像((a+b) + (c))
这样的表达式?
如果您要小心检查输入中的语法错误是否导致程序崩溃,则可以使用call stack(sp
)作为其中之一。{p> (例如,将bp
与sp
进行比较,以检测您何时清空了您在调用堆栈中存储的堆栈数据结构。
不要将sp
更改为指向其他堆栈数据结构;使用不同的寄存器(如si
)来访问它。
您可以使用lodsw
弹出ax(方向标志设置适合您的堆栈增长方向)。或者使用stosw
将ax推到di
指向的堆栈上。但由于它们使用不同的索引寄存器,因此不值得(特别是不能一直改变方向标志)。
因此,对于第二个堆栈数据结构,只需使用正常的mov
加载/存储和add/subb si, 2
。
如果证明将其中一个堆栈保留在调用堆栈(sp
)上不方便,那么也不要这样做。