Strumenti Utente

Strumenti Sito


informatica:ae:execdrisc

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisioneRevisione precedente
informatica:ae:execdrisc [08/04/2011 alle 13:14 (14 anni fa)] Marco Daneluttoinformatica:ae:execdrisc [08/04/2011 alle 20:55 (14 anni fa)] (versione attuale) Marco Danelutto
Linea 7: Linea 7:
  
 <code ocaml "drisc.ml"> <code ocaml "drisc.ml">
- 
- 
 (** shortcut to maps ... *) (** shortcut to maps ... *)
 type assoc = Ass of string * int;; type assoc = Ass of string * int;;
Linea 36: Linea 34:
      Penv(pc,r,m,a) ->      Penv(pc,r,m,a) ->
  printf "PC=%d \n" !pc;   printf "PC=%d \n" !pc; 
 +        printf "%d registers. #MV = %d \n" 
 + (Array.length r) (Array.length m);
         pp_reg_set r;         pp_reg_set r;
         pp_mem m         pp_mem m
Linea 43: Linea 43:
     @param i the instruction to be executed      @param i the instruction to be executed 
     @param env the initial environment. it is modified via side effects *)     @param env the initial environment. it is modified via side effects *)
-let exec_i i env = +let step pgm env =  
 +  let apgm = Array.of_list (prog_to_asm pgm) in
   match env with    match env with 
     Penv(pc,r,m,labs) ->     Penv(pc,r,m,labs) ->
-  (match i with +  (let i = apgm.(!pc) in  
 +   match i with 
     ADD(Reg(a),Reg(b),Reg(c)) -> r.(c) := !(r.(a)) + !(r.(b));pc:= !pc+1     ADD(Reg(a),Reg(b),Reg(c)) -> r.(c) := !(r.(a)) + !(r.(b));pc:= !pc+1
 |   SUB(Reg(a),Reg(b),Reg(c)) -> r.(c) := !(r.(a)) - !(r.(b));pc:= !pc+1 |   SUB(Reg(a),Reg(b),Reg(c)) -> r.(c) := !(r.(a)) - !(r.(b));pc:= !pc+1
Linea 98: Linea 100:
        then pc := !pc + l         then pc := !pc + l 
        else pc := !pc + 1        else pc := !pc + 1
-| _ -> printf "UNINPLEMENTED")+|   END -> failwith "Program terminated" 
 +| _ -> printf "UNIMPLEMENTED:"; pp_asm i)
 ;; ;;
  
Linea 114: Linea 117:
        | LabInstr(LabOff(l),i) -> (labels ri (addr+1))        | LabInstr(LabOff(l),i) -> (labels ri (addr+1))
       )       )
 +;;
 +
 +let create_regs n = 
 +  Array.create n (ref 0);; 
 +
 +let stepper r m ipc prg steps = 
 +  let pc = ref ipc in 
 +  let reg = create_regs r in 
 +  let mem = create_regs m in 
 +  let penv = Penv(pc,reg,mem,(labels prg 0)) in 
 +  let aprg = Array.of_list prg in
 +
 +  for i=0 to steps do
 +    printf "===========> STEP %d: executing " i; 
 + (pp_instr !pc aprg.(i)); printf "\n";
 +    step prg penv; 
 +    dump penv;
 +  done
 ;; ;;
 </code> </code>
informatica/ae/execdrisc.1302268466.txt.gz · Ultima modifica: 08/04/2011 alle 13:14 (14 anni fa) da Marco Danelutto

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki