Два стека в ассемблере?
Я пишу код на 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
), то тоже не делай этого.