1

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

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

谢谢!

4

2 回答 2

2

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

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

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

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

于 2016-06-19T12:15:24.850 回答
0

因此,您想使用两个堆栈数据结构来评估表达式,例如((a+b) + (c))

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

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

您可以使用lodswpop into ax (为您的堆栈增长方向适当设置方向标志)。或用于stosw将 ax 推入由 指向的堆栈di。但是由于它们使用不同的索引寄存器,所以不值得(尤其是不要一直更改方向标志)。

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

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

于 2016-06-20T01:54:44.437 回答