
Simulatore
Anche il processo simulatore necessita in ingresso di alcuni parametri, secondo la seguente sintassi:
c:\Simulator <*.hex file> <*.ram Image File> <-log| -unlog>
Il file *.hex viene passato in funzione del file *.asm del progetto corrente mentre il file immagine e l’opzione log o unlog dipendono dalla finestra di dialogo riportata in figura 21.

figura 21 – Schermata per la selezione del file del file immagine
L’opzione “Update log file on fetch event” permette di abilitare la scrittura del file di log ogni volta che viene caricata una nuova istruzione; in realtà vengono loggate tutte le fasi successive ovvero quella di decode e di execute riportando in ultimo il dump dei registri interni. Tale opzione è di particolare utilità per controllare parti di programma critiche (la sua abilitazione rallenta la simulazione a causa del continuo accesso al file di *.slg). Il simulatore al pari del compilatore può essere eseguito in ambiente DOS o altri sistemi operativi, se ricompilato.
Il programma principale Simulator.c include i seguenti file header (oltre ad alcuni header delle librerie standard):
#include "myVariable.h" // variabili globali
#include "myConstant.h" // dichiara le costanti degli operandi e di programma
#include "myFunction.h" // dichiara funzioni matematiche IntToBin BinToInt…
#include "exeIstr.h" // funzioni relative alle istruzioni da eseguire
#include "compute.h" // ha le funzioni fetch decode execoute
Alcune, utilizzate nel programma di compilazione, sono state riutilizzate anche in questo programma. Dopo la lettura e il controllo dei parametri passati il programma provvede ad allocare degli spazi di memoria in modo da simulare la RAM del microprocessore e la rispettiva ROM. Allocati gli spazi opportuni viene letto il file esadecimale e successivamente il file immagine. Lo spazio di memoria RAM dedicata all’immagine destinazione viene settato a FFh tramite programma piuttosto che leggere e riportare in RAM il contenuto del file. Tutte le operazioni di cui sopra vengono loggate nel file *.slg. Prima di avviare la simulazione vengono inizializzati gli array di contatori nei quali vengono conteggiati gli accessi ai registri interni e l’uso delle varie istruzioni.
Complessivamente ai fini dell’analisi statistica sono utilizzate le seguenti variabili :
int NumeroIstruzioni; // conta il numero di istruzioni lette
long int counterReg [15]; // conta accesso ai singoli registri
long int counterIstr [15]; // conta esecuzione delle singole istruzioni (8)
long int branchUp =0;
long int branchDown =0;
Prima di avviare la simulazione viene posta la variabile PC=0. L’intera simulazione viene svolta all’interno del seguente ciclo infinito, alla fine del quale viene creato un file di output contenente l’immagine di uscita e il file di log viene chiuso.
while (1) // ciclo infinito
{ printf ("."); // stampa sullo schermo punto/istruzione
fetch (Istruzione,PrgMemory,log);
decode (Istruzione,log);
PC++; // il BRGT cambierà eventualmente il PC
if (execut (ImgMemory,log)) break; // ritorna 1 se esegue RETURN (esco se 1)
}
Da quanto spiegato si capisce l’utilità dei file header, grazie ai quali si è potuta mantenere una linearità concettuale nella stesura del programma. Le funzioni fetch, decode ed execute sono contenute nel file compute.h; da questo file vengono poi richiamate le rispettive funzioni (contenute nel file exeIstr.h) che implementano le istruzioni di volta in volta caricate e decodificate. Si riporta sotto il file di log *.slg relativo alla simulazione del file precedentemente compilato; non si fa uso della memoria destinata all’immagine destinazione.
Set Program file : C:\WINDOWS\Desktop\Prova.hex
Set Image file : C:\WINDOWS\Desktop\Digitale\Sorgente\img_mem.img
Program's Array memory allocated
Image's Array memory allocated
Open Program file : C:\WINDOWS\Desktop\Prova.hex
Program loaded.
Open Image file : C:\WINDOWS\Desktop\Digitale\Sorgente\img_mem.img
Image loaded.
Image's destination RAM is set to 0xFF.
The loaded Program is :
0 : 1100000000000001
1 : 1100010000011110
2 : 1100011000001000
3 : 1110011001100010
4 : 0010011001100000
5 : 1101110000001000
6 : 0100011001011100
7 : 0110000000000000
*********** START SIMULATION ***********
Interrupt received
Internal Registers clear
Fetch intstruction 0 : 1100000000000001
Instruction Decode like : MOVE
Opcode : 6
Destination Register : 0
Immediate Operand : 1
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000000000
Reg3 : 0000000000000000000
[…]
Reg14 : 0000000000000000000
Reg15 : 0000000000000000000
Fetch intstruction 1 : 1100010000011110
Instruction Decode like : MOVE
Opcode : 6
Destination Register : 2
Immediate Operand : 30
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000011110
Reg3 : 0000000000000000000
[…]
Reg14 : 0000000000000000000
Reg15 : 0000000000000000000
Fetch intstruction 2 : 1100011000001000
Instruction Decode like : MOVE
Opcode : 6
Destination Register : 3
Immediate Operand : 8
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000011110
Reg3 : 0000000000000001000
[…]
Reg14 : 0000000000000000000
Reg15 : 0000000000000000000
Fetch intstruction 3 : 1110011001100010
Instruction Decode like : SHIFTL
Opcode : 7
Destination Register : 3
Source Register 1 : 3
Immediate Operand : 2
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000011110
Reg3 : 0000000000000100000
[…]
Reg14 : 0000000000000000000
Reg15 : 0000000000000000000
Fetch intstruction 4 : 0010011001100000
Instruction Decode like : SUB
Opcode : 1
Destination Register : 3
Source Register 1 : 3
Source Register 2 : 0
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000011110
Reg3 : 0000000000000011111
[…]
Reg14 : 0000000000000000000
Reg15 : 0000000000000000000
Fetch intstruction 5 : 1101110000001000
Instruction Decode like : MOVE
Opcode : 6
Destination Register : 14
Immediate Operand : 8
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000011110
Reg3 : 0000000000000011111
[…]
Reg14 : 0000000000000001000
Reg15 : 0000000000000000000
Fetch intstruction 6 : 0100011001011100
Instruction Decode like : BRGT
Opcode : 2
Load PC from Register : 14
Source Register 1 : 3
Source Register 2 : 2
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000011110
Reg3 : 0000000000000011111
[…]
Reg14 : 0000000000000001000
Reg15 : 0000000000000000000
Fetch intstruction 4 : 0010011001100000
Instruction Decode like : SUB
Opcode : 1
Destination Register : 3
Source Register 1 : 3
Source Register 2 : 0
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000011110
Reg3 : 0000000000000011110
[…]
Reg14 : 0000000000000001000
Reg15 : 0000000000000000000
Fetch intstruction 5 : 1101110000001000
Instruction Decode like : MOVE
Opcode : 6
Destination Register : 14
Immediate Operand : 8
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000011110
Reg3 : 0000000000000011110
[…]
Reg14 : 0000000000000001000
Reg15 : 0000000000000000000
Fetch intstruction 6 : 0100011001011100
Instruction Decode like : BRGT
Opcode : 2
Load PC from Register : 14
Source Register 1 : 3
Source Register 2 : 2
Execute done.
Register Dump
Reg0 : 0000000000000000001
Reg1 : 0000000000000000000
Reg2 : 0000000000000011110
Reg3 : 0000000000000011110
[…]
Reg14 : 0000000000000001000
Reg15 : 0000000000000000000
Fetch intstruction 7 : 0110000000000000
Instruction Decode like : RETURN
Opcode : 3
*********** SIMULATION END ***********
Statistics file created : C:\WINDOWS\Desktop\Prova.sta
Image file output created : C:\WINDOWS\Desktop\Prova.img
Log END