Això és el test de la classe Programa
,
que correspon a la pràctica
Simulació d’un SO.
Aquesta classe implementa un intèrpret de programa
escrit en un llenguatge assemblador senzill.
Aquesta classe contindrà un programa en aquest
llenguatge, i a més, l’executarà instrucció a instrucció.
Com veureu, us donem els fitxers programa.hpp
i
programa.cpp
que contenen, respectivament, l’especificació
de la classe i la implementació d’algunes dels mètodes.
En aquesta part haureu d’implementar els mètodes que manquen.
Per a entendre la part que us falta implementar, caldrà que entengueu el joc d’instruccions del programa i també l’estructura interna d’un programa. Molts d’aquests conceptes ja els haureu vist en assignatures d’estructura de computadors.
En primer lloc, un programa tindrà un comptador de programa
(PC
) que indicarà la línia de codi que cal executar del programa.
En un programa, cada línia té implícit un número de línia, que comença
amb el 10 i avança de 10 en 10. Per exemple:
10: DISPBUIT 50 20: LLEGEIX x 30: EMPILA x 40: GOTO 10 50: PILABUIDA 90 60: DESEMPILA x 70: ESCRIU x 80: GOTO 50 90: NOFARES
La primera línia sempre és la 10. Diem que els números de línia són implícits perquè quan instanciem un programa, no els posem de manera explícita. Per exemple, el programa anterior estaria escrit de la següent manera:
DISPBUIT 50 LLEGEIX x EMPILA x GOTO 10 PILABUIDA 90 DESEMPILA x ESCRIU x GOTO 50 NOFARES
però com que es tracta d’un llenguagte que no té la declaració ni de funcions ni de subrutines, és bastant fàcil deduir el número de cada línia.
Per altra banda, un programa també té un identificador
(_id
), una prioritat (_prioritat
) i
un identificador del processador a què pertany (_proc
)
(això no cal que ho tingueu en compte fins que feu la versió final
de la pràctica).
Internament, té dos registres: un registre d’estatus
(STATUS
) que té l’estatus en què ha acabat la darrera instrucció
que s’ha executat, i també un estatus de la darrera comparació
(COMPARACIO
), que indica l’estatus de la darrera instrucció de
comparació.
El registre STATUS
pot tenir els següents valors:
El registre COMPARACIO
pot tenir els següents valors:
A més, també té una pila interna (pila
), que té una capacitat
màxima definida a la variable CAPACITAT = 100
,
una memòria (un objecte de tipus memoriaBST
) i un
dispositiu (un objecte de tipus Dispositiu
).
El joc d’instruccions possibles és aquest:
SUMA op1 op2 RESTA op1 op2 MULT op1 op2 DIV op1 op2 op1 i op2 poden ser: (1) enters (2) noms de variables el resultat de l'operació s'empila a la pila del programa. errors: -1 pila plena -2 divisió per zero
EMPILA op op pot ser un enter o un nom de variable. empila op a la pila del programa. errors: -1 pila plena DESEMPILA op op és un nom de variable. desempila el valor de la pila del programa i el posa a op. errors: -3 pila buida
LLEGEIX op op és un nom de variable. posa el valor contingut del dispositiu a la variable de memòria op. errors: -8 dispositiu buit ESCRIU op op pot ser un enter o una variable. posa el valor d'op al dispositiu. errors: -9 dispositiu ple
MOU op1 op2 op1 és una variable de memòria. op2 pot ser una variable de memòria o un enter. assigna a op1 el valor d'op2
GOTO op op és un enter múltiple de 10 que indica una línia del programa. fa un salt incondicional a op. errors: -5 op és una línia que no existeix MESGRAN op MESPETIT op IGUAL op PILABUIDA op DISPBUIT op op és un enter múltiple de 10 que indica una línia del programa. fa un salt condicionat a op: si el flag de comparació és més petit, més gran, igual, o la pila del programa és buida, o el dispositiu és buit. errors: -5 op és una línia que no existeix
CMP op1 op2 op1 i op2 poden ser enters o variables de memòria. compara els valors continguts a op1 i op2 i posa el flag de comparació a: 1: op1 > op2 2: op1 < op2 3: op1 = op2
INCREMENTA op DECREMENTA op op és una variable de memòria. incrementa o decrementa en una unitat el valor de la variable de memòria op.
NOFARES
.
Aquesta operació no fa literalment res (llevat d’incrementar PC
).Tingueu en compte que cada vegada que executem una instrucció
es pot modificar el comptador de programa (PC
),
l’estatus (STATUS
) i l’indicador de comparació
(COMPARACIO
)
Fixeu-vos que l’enunciat d’aquest exercici ja ofereix uns fitxers que haureu d’utilitzar per a compilar: Makefile, program.cpp,
apart de les versions *.old
dels altres fitxers que heu
d’acabar d’implementar.
A més, per a fer aquesta part haureu de penjar també
les implementacions de les classes Dispositiu
i memoriaBST
, a més del fitxer BST.cpp
que heu fet en els passos anteriors.
Quan pugeu la vostra solució al jutge, només cal que pugeu un tar construït així:
tar cf solution.tar memoriaBST.cpp memoriaBST.hpp BST.cpp dispositiu.cpp dispositiu.hpp programa.cpp programa.hpp
Input
INICI_PROGRAMA MOU x 0 DISPBUIT 60 LLEGEIX y INCREMENTA x GOTO 20 ESCRIU x NOFARES FINAL_PROGRAMA # aquest programa compta el nombre d'elements # que hi ha al dispositiu i ho escriu al dispositiu. # el contingut anterior del dispositiu s'esborra.
Output
-------------------------------- PROGRAM ID: 0 PRIO: 100 PROC#: 0 AC: 0 PC: 10 STATUS: 0 STACK: 0/100 10: MOU x 0 <- PC 20: DISPBUIT 60 30: LLEGEIX y 40: INCREMENTA x 50: GOTO 20 60: ESCRIU x 70: NOFARES -------------------------------- Abans de l'execució DISPOSITIU_ID: 0 : 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Després de l'execució. Status: -10 DISPOSITIU_ID: 0 : 20
Input
INICI_PROGRAMA DISPBUIT 50 LLEGEIX x EMPILA x GOTO 10 PILABUIDA 90 DESEMPILA x ESCRIU x GOTO 50 NOFARES FINAL_PROGRAMA # aquest programa capgira els elements que hi ha al dispositiu.
Output
-------------------------------- PROGRAM ID: 0 PRIO: 100 PROC#: 0 AC: 0 PC: 10 STATUS: 0 STACK: 0/100 10: DISPBUIT 50 <- PC 20: LLEGEIX x 30: EMPILA x 40: GOTO 10 50: PILABUIDA 90 60: DESEMPILA x 70: ESCRIU x 80: GOTO 50 90: NOFARES -------------------------------- Abans de l'execució DISPOSITIU_ID: 0 : 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Després de l'execució. Status: -10 DISPOSITIU_ID: 0 : 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10