2016-06-19 72 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),那麼也不要這樣做。