我在编码8086汇编器,我遇到了一个有趣的问题。主题是评估括号。如果这是Java
或C
中的问题,我会简单地定义两个堆栈 - 一个用于数字,另一个用于操作数。我可以在Assembly
做类似的事吗? 据我所知,栈是在数据段的最后一个存储单元中定义的。如果我定义了另一个数据段,我会有另一个可用的堆栈吗?汇编程序中的两个堆栈?
另一个信息:我不知道开始时的输入大小,我应该尽可能提高程序的效率。
谢谢!
我在编码8086汇编器,我遇到了一个有趣的问题。主题是评估括号。如果这是Java
或C
中的问题,我会简单地定义两个堆栈 - 一个用于数字,另一个用于操作数。我可以在Assembly
做类似的事吗? 据我所知,栈是在数据段的最后一个存储单元中定义的。如果我定义了另一个数据段,我会有另一个可用的堆栈吗?汇编程序中的两个堆栈?
另一个信息:我不知道开始时的输入大小,我应该尽可能提高程序的效率。
谢谢!
据我所知,该协议栈中的数据段的最后一个存储单元difined
,如果你正在开发一个.COM样式的程序,所有的段寄存器具有这是真的相同的值以及DOS将堆栈指针置于64KB内存的高端位置。
如果我要定义另一个数据段,我会有另一个可用的堆栈吗?
有没有必要更改数据段有另一个堆栈。更改SS:SP寄存器对并开始使用新定义的堆栈。
堆栈向下延伸,从SP
开始。所以如果你有SP = 4096那么堆栈将是4096字节。 (不包括可能是错误的环绕)
所以,你想用两个stack data structures来评估表达式,如((a+b) + (c))
?
如果您仔细检查输入中的语法错误是否会导致程序崩溃,则可以使用call stack(sp
)作为其中之一。 (例如,比较bp
与sp
来检测您何时清空了存储在调用堆栈中的堆栈数据结构)。
不要更改sp
指向其他堆栈数据结构;使用不同的寄存器(如si
)来访问它。
你可以使用lodsw
弹出斧头(方向标志设置适当的方向,你有你的堆栈增长)。或者使用stosw
将斧头推到di
指向的堆栈上。但是由于它们使用了不同的索引寄存器,所以不值得(特别是不要一直改变方向标记)。
因此,对于第二个堆栈数据结构,只需使用正常的mov
加载/存储和add/subb si, 2
。
如果证明不方便将其中一个堆栈保留在调用堆栈上(sp
),那么也不要这样做。
谢谢。比这应该工作? 堆栈100h 推斧 推bx ... MOV AX,SS MOV BX,SP MOV SS,0F00H MOV SP,0F00H 比我有斧一个堆栈:BX和SS另一个堆栈:SP? – DoronZor
一次只能激活一个堆栈:用SS:SP定义一个堆栈。您可以设置第二个内存区域用于堆栈目的,但您需要在SS:SP对中加载指向该区域的完整指针。 –
也有类似'mov ss,0f00h'的指令不存在!您不能移动段寄存器中的立即值(数字)。 –