2016-06-19 7 views
1

Я кодирую ассемблер 8086, и у меня возник интересный вопрос. Тема состоит в том, чтобы оценить круглые скобки. Если бы это был вопрос в Java или C, я бы просто определил два стека - один для чисел, а другой для операндов. Могу ли я сделать что-то подобное в Assembly? Насколько я знаю, Stack определяется в последних ячейках памяти сегмента данных. Если я определяю другой сегмент данных, у меня будет другой полезный стек?Два стека в ассемблере?

Другая информация: я не знаю размер ввода в начале, и я должен сделать программу максимально эффективной.

Спасибо!

ответ

2

Насколько я знаю, стек difined в последних ячейках памяти сегмента данных

Это верно, если вы разрабатываете программу .COM стиль, где все сегментные регистры имеют то же значение и где DOS помещал указатель стека в верхнюю часть этой 64 КБ памяти.

Если у меня будет другой сегмент данных, у меня будет другой полезный стек?

Там нет необходимости менять сегмент данных иметь другой стек. Измените пар регистра SS: SP и начните использовать новый определенный стек.
Складывается вниз, начиная с SP. Поэтому, если у вас есть SP = 4096, тогда стек будет составлять 4096 байт. (не считая wraparound, который, вероятно, был бы ошибочным в любом случае)

+0

спасибо. Чем это должно работать? стоп 100ч толкатель топора толчок bx ... мы ах, сс мов Ьх, зр мов сс, 0f00h мов зр, 0f00h И чем у меня есть один стек в топоре: BX и другой стек в SS: зр? – DoronZor

+0

В каждый момент времени может быть только один стек: тот, который определяется SS: SP. Вы можете настроить вторую область памяти для целей стекирования, но вам нужно загрузить полный указатель на этот регион в паре SS: SP. –

+0

Также не существует инструкции типа 'mov ss, 0f00h'! Вы не можете переместить немедленное значение (число) в регистре сегментов. –

0

Итак, вы хотите использовать два stack data structures для оценки выражений типа ((a+b) + (c))?

Вы можете использовать call stack (sp) для одного из них, если вы тщательно проверяете, что синтаксические ошибки во входном файле не приводят к сбою вашей программы. (например, сравните bp с sp, чтобы определить, когда вы очистили структуру данных стека, которую вы храните в стеке вызовов).

Не изменяйте sp, чтобы указать на другую структуру данных стека; используйте другой регистр (например, si) для доступа к нему.

Вы можете использовать lodsw, чтобы вставить в топор (с установленным флажком направления для направления роста вашего стека). Или используйте stosw, чтобы толкать топор на стек, на который указывает di. Но поскольку они используют разные индексные регистры, это не стоит (особенно не меняя флаг направления все время).

Итак, для структуры данных второго стека просто используйте нормальные mov загрузки/магазины и add/subb si, 2 в зависимости от ситуации.

Если неудобно хранить один из стеков в стеке вызовов (sp), тогда не делайте этого.