Два стека в ассемблере?

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

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

Спасибо!

2 ответа

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам