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