2016-06-19 68 views
1

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

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

谢谢!

回答

2

据我所知,该协议栈中的数据段的最后一个存储单元difined

,如果你正在开发一个.COM样式的程序,所有的段寄存器具有这是真的相同的值以及DOS将堆栈指针置于64KB内存的高端位置。

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

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

+0

谢谢。比这应该工作? 堆栈100h 推斧 推bx ... MOV AX,SS MOV BX,SP MOV SS,0F00H MOV SP,0F00H 比我有斧一个堆栈:BX和SS另一个堆栈:SP? – DoronZor

+0

一次只能激活一个堆栈:用SS:SP定义一个堆栈。您可以设置第二个内存区域用于堆栈目的,但您需要在SS:SP对中加载指向该区域的完整指针。 –

+0

也有类似'mov ss,0f00h'的指令不存在!您不能移动段寄存器中的立即值(数字)。 –

0

所以,你想用两个stack data structures来评估表达式,如((a+b) + (c))

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

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

你可以使用lodsw弹出斧头(方向标志设置适当的方向,你有你的堆栈增长)。或者使用stosw将斧头推到di指向的堆栈上。但是由于它们使用了不同的索引寄存器,所以不值得(特别是不要一直改变方向标记)。

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

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