%include "rw32-2018.inc" %assign OP_ADD 0x80000003 %assign OP_SUB 0x80000002 %assign OP_MUL 0x80000001 %assign OP_DIV 0x80000000 section .data equ1 dd 42 equ2 dd OP_ADD, 65, -23 equ3 dd OP_MUL, OP_DIV, 60, -10, OP_SUB, 3, 10 section .text CMAIN: push dword equ1 call Calculate call WriteInt32 call WriteNewLine ; na vrcholu zasobniku by mel byt ukazatel na OP_ADD call Calculate call WriteInt32 call WriteNewLine ; na vrcholu zasobniku by mel byt ukazatel na OP_MUL call Calculate call WriteInt32 call WriteNewLine add esp, 4 xor eax, eax ret ; Ukol: napiste obsah funkce Calculate vycislujici priklad v prefixove notaci ; Vstup: ukazatel na rovnici (pres zasobnik) ; Vystup: ukazatel za rovnici (pres zasobnik, nahradte vstupni parametr), vysledek dane rovnice (eax) ; Poznamky: - vyuzijte rekurzi pro spocteni "podvyrazu" ; - preteceni neberte do uvahy ; - zalohujte registry, jestli to uznate za vhodne Calculate: ; vytvoreni zasobnikoveho ramce ; vytvoreni mista pro mezivysledek (lokalni promennou) ; nacteni parametru (ukazatele), nacteni prvniho symbolu ; ukoncovaci podminka rekurze -- jestlize je nacteny symbol cislem, vraceni hodnoty pres eax, ; prepis parametru na zasobniku ukazatelem na dalsi prvek + uklizeni ramce a navrat z funkce (mozno resit skokem ke konci funkce) ; rekurzivne volani Calculate nad nasledujicimi symboly pro ziskani 2 operandu ; ulozeni prvniho vysledku do lokalni promenne ; vykonani pozadovane operace nad ziskanymi cisly, pozor na poradi, vraceni vysledku pres eax ; prepis parametru na zasobniku ukazatelem na dalsi prvek ; uklizeni ramce a navrat z funkce