! Definizione delle costanti _ZERO = 48 _NOVE = 57 _UGUALE = 61 ! "=" _PAP = 40 ! "(" _PCH = 41 ! ")" _PER = 42 ! "*" _PIU = 43 ! "+" _MENO = 45 ! "-" _DIV = 47 ! "/" _SP = 32 ! " " _N = 10 ! "\n" _GETCHAR = 117 _PRINTF = 127 _PUTCHAR = 122 _EXIT = 1 .SECT .TEXT PUSH _UGUALE !Carica sullo stack il simbolo "=" iniziale PUSH strich PUSH _PRINTF SYS POP CX POP CX PUSH _GETCHAR SYS POP CX MOVB (ult),AL PUSH strisp PUSH _PRINTF SYS POP CX POP CX JMP first start: !Inizio ciclo di input PUSH _GETCHAR SYS POP CX !Elimino la chiamata dallo stack MOVB (ult),AL first: CMPB (ult),_N JE cr CMPB (ult),_ZERO JL op !Verifico se il carattere e' una cifra numerica CMPB (ult),_NOVE !Se e' un carattere con valore ASCII inferiore a quello dello "0" JG op !o superiore a quello del "9" !il controllo passa alla verifica dell'operatore MOVB AL,(ult) PUSH AX PUSH _PUTCHAR SYS POP CX POP CX MOVB (spz),1 JMP start op: !Verifica dell'operatore e confronto !con la cima dello stack CMPB (spz),0 JE cont !Verifica se e' necessario inserire uno spazio PUSH _SP PUSH _PUTCHAR SYS POP CX POP CX MOVB (spz),0 cont: !Scelta del comportamento da tenere in base !all'ultimo carattere CMPB (ult),_UGUALE JE uguale CMPB (ult),_PIU JE piu CMPB (ult),_MENO JE piu CMPB (ult),_PER JE per CMPB (ult),_DIV JE per CMPB (ult),_PAP JE pap CMPB (ult),_PCH JE pch JMP start !Se il carattere inserito non e' riconosciuto viene ignorato !Scelta del comportamento da tenere in base al carattere in cima allo stack pch: !Caso in cui ult e' ")" POP DX PUSH DX CMPB DL,_UGUALE JE errore POP DX PUSH DX CMPB DL,_PAP JE popp PUSH _PUTCHAR SYS POP CX POP CX MOVB (spz), 1 !Imposta la variabile sp in modo che al prossimo !ciclo venga inserito uno spazio JMP op popp: !"I vagoni spariscono..." POP CX JMP start pap: !Caso in cui ult e' "(" MOVB BL,(ult) MOVB BH,0 PUSH BX JMP start piu: !Caso in cui ult e' "+" o "-" POP DX PUSH DX CMPB DL, _UGUALE JE stack CMPB DL, _PAP JE stack PUSH _PUTCHAR SYS POP CX POP CX MOVB (spz), 1 JMP op per: !Caso in cui ult e' "*" o "/" POP DX PUSH DX CMPB DL, _UGUALE JE stack CMPB DL, _PAP JE stack CMPB DL, _PIU JE stack CMPB DL, _MENO JE stack PUSH _PUTCHAR SYS MOVB (spz), 1 JMP op stack: ! "Manda il vagone in TEXAS..." MOVB BL,(ult) MOVB BH,0 PUSH BX JMP start uguale: !Lo stack si svuota perche' e' stato trovato il carattere "=" finale POP DX PUSH DX CMPB DL, _PAP JE errore CMPB DL, _UGUALE JE fine !Lo stack e' vuoto - fine programma PUSH _PUTCHAR SYS POP CX POP CX PUSH _SP PUSH _PUTCHAR SYS POP CX POP CX JMP uguale errore: PUSH sterr PUSH _PRINTF SYS PUSH 1 PUSH _EXIT SYS fine: PUSH stfin PUSH _PRINTF SYS PUSH 0 PUSH _EXIT SYS cr: MOVB (ult),_UGUALE JMP op .SECT .DATA ult: .BYTE 0 spz: .BYTE 0 strich: .ASCII "\nInserire l'espressione da convertire (possibilmente finire con =) \n\0" strisp: .ASCII "\nL'espressione, convertita in RPN e' la seguente: \n\0" sterr: .ASCII "L'espressione ha generato un errore\n\0" stfin: .ASCII "\n\n\0" .SECT .BSS