@frilix
Иногда "творю"

Генерация кода для условных выражений?

Доброго времени суток, стоит задача написать генератор для условных выражений. Для этого я все эти выражения загнал в обратную польскую запись, то есть выражение: 7 > 6 and 6 < 3 в этой записи будет таким: 7 6 > 6 3 < and , что вполне нормально и соответствует приоритетам. Но вот как это запрограммировать ? в общем то есть идея но там есть несостыковочки.

Именно я планировал использовать стек в ассемблере и помещать туда результат выполнения операции в виде нуля и единицы, то есть до того как дойти до end, в стеке будет 0 1, после чего сам end возьмет 0 и 1 и также вернет результат ( а данном случае 0), после того как законченно логическое выражение мы смотрим в стек и если в нем 1, то выполняем ветку истинного условия, если ложно то соответственно ветку ложного условия.
Планировал я это реализовать при помощи меток, что-то типа:

zero:
push $0

one:
push $1


Зная что операции сравнения имеют семейство условных переходов я планировал к ним обращаться и таки способом заполнять стек нулями и единицами, но вопрос , а как вернуться назад ? (надо понимать, что это код будет писать генератор) а может есть по проще алгоритмы решения данной задачи?
  • Вопрос задан
  • 402 просмотра
Решения вопроса 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Подход с польской записью возможен, если нужны только выражения. По поводу "А как вернуться назад?":
1. Если вы храните строку с токенами в польской записи в каком-то массиве, и обрабатываете их в цикле, то после push $0/ push $1 можно сделать безусловный jump на начало цикла обработки.
2. Использовать call, адрес возврата будет положен на стек и вы вернетесь к месту вызова по ret. Но в этом случае не получится использовать аппаратный (push, pop) стек без дополнительных извращений. Заведите массив под еще один стек для ваших данных. Гуглите "стек на массиве", если не понятно о чем я. Это кажется усложнением, но с большой вероятностью вы захотите использовать стек для чего-то еще потом. Не стоит сразу его резервировать для одной цели.
3. Вместо условных переходов можно попытаться загрузить результат сравнений из регистра флагов напрямую.
pushf			; Скопировать регистр флагов...
pop ax			; ...в регистр AX

остается сделать and с маской для нужного флага и сдвинуть (shr) чтобы получить 0 или 1.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
До фразы "... мы смотрим в стек и если в нем 1, то выполняем ветку истинного условия, если ложно то соответственно ветку ложного условия" все абсолютно верно. А дальше я не понимаю ход Ваших мыслей, извините ... Поясните другими словами ? Какая у Вас в итоге цель ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы