我在編碼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'的指令不存在!您不能移動段寄存器中的立即值(數字)。 –