From b840059a7f2fb0e3796414f30f1e241d03b44dbf Mon Sep 17 00:00:00 2001 From: Alex AUVOLAT Date: Fri, 10 Jan 2014 16:55:37 +0100 Subject: =?UTF-8?q?Correction=20de=20li=20pour=20valeurs=20n=C3=A9gatives?= =?UTF-8?q?=20;=20utilisation=20de=20labels=20dans=20des=20data.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asm/asm.ml | 1 + asm/asmlex.mll | 1 + asm/asmpars.mly | 23 +++++++++++++++-------- asm/assembler.ml | 6 ++++-- 4 files changed, 21 insertions(+), 10 deletions(-) (limited to 'asm') diff --git a/asm/asm.ml b/asm/asm.ml index 47f5f7b..b52eda4 100644 --- a/asm/asm.ml +++ b/asm/asm.ml @@ -56,6 +56,7 @@ type instr = | Lra of imm | Byte of int | Word of int + | Wlab of string | Hlt module Imap = Map.Make(String) diff --git a/asm/asmlex.mll b/asm/asmlex.mll index 873e32d..cace4b7 100644 --- a/asm/asmlex.mll +++ b/asm/asmlex.mll @@ -104,6 +104,7 @@ rule token = parse | '(' { LP } | ')' { RP } | '"' { str [] lexbuf } + |';' { SEMIC } and str acc = parse | "\\\\" { str ('\\' :: acc) lexbuf } diff --git a/asm/asmpars.mly b/asm/asmpars.mly index 8f47c91..76b5ce2 100644 --- a/asm/asmpars.mly +++ b/asm/asmpars.mly @@ -23,17 +23,24 @@ let li u r = function | Imm i -> - let c = - if u then i < 1 lsl 8 - else i >= -(1 lsl 7) && i < 1 lsl 7 in - if c then (add pc 2; [Lilz (r,Imm i)]) - else (add pc 4; [Lilz (r,Imm (i land 0x00FF)); Liu (r,Imm ((i land 0xFF00) lsr 8))]) + if u then + if i < 1 lsl 8 then (add pc 2; [Lilz (r,Imm i)]) + else (add pc 4; [Lil (r,Imm (i land 0x00FF)); Liu (r,Imm ((i land 0xFF00) lsr 8))]) + else if i >=0 && i < 1 lsl 7 then + (add pc 2; [Lilz (r,Imm i)]) + else if i < 0 && i >= - ( 1 lsl 7 ) then + (add pc 4; [Lil (r,Imm i); Liu (r,Imm 0xFF)]) + else (add pc 4; [Lil (r,Imm (i land 0x00FF)); Liu (r,Imm ((i land 0xFF00) asr 8))]) | Lab id -> add pc 4; [Lilz (r,Lab id); Liu (r,Lab id)] + + let itw = function + | Imm i -> Word i + | Lab l -> Wlab l %} -%token EOF,COLON,TEXT,DATA,BYTE,WORD,MINUS,MOVE,JZ,JNZ,LP,RP,HLT,ASCII +%token EOF,COLON,TEXT,DATA,BYTE,WORD,MINUS,MOVE,JZ,JNZ,LP,RP,HLT,ASCII,SEMIC %token POP,PUSH,INCRI,SHI,JJ,JAL,JR,JALR,LW,SW,LB,SB,NOT,LIL,LILZ,LIU,LIUZ,LRA,LI %token REG %token ROP,RIOP @@ -127,8 +134,8 @@ _instr: add pc 2; l @ [R (Jner,r,5,0)] } | POP r=REG { add pc 4; [Lw (r,7,0); Incri (7,2)] } | PUSH r=REG { add pc 4; [Incri (7,-2); Sw (r,7,0)] } - | BYTE bs=int* { List.map (fun b -> add pc 1; Byte b) bs } - | WORD ws=int* { List.map (fun w -> add pc 2; Word w) ws } + | BYTE bs=int+ SEMIC { List.map (fun b -> add pc 1; Byte b) bs } + | WORD ws=imm+ SEMIC { List.map (fun w -> add pc 2; itw w) ws } | HLT { add pc 2; [Hlt] } | ASCII s=STR { List.map (fun c -> add pc 1; Byte (Char.code c)) s } diff --git a/asm/assembler.ml b/asm/assembler.ml index 66999fb..c794c98 100644 --- a/asm/assembler.ml +++ b/asm/assembler.ml @@ -114,7 +114,8 @@ let print_program p = sprintf "liuz %s %s" (rts r) (its i) | Hlt -> (0b01111 lsl 11),"hlt" | Word w -> (byte 16 w), "" - | Byte b -> byte 8 b, "" in + | Byte b -> byte 8 b, "" + | Wlab l -> fst (Imap.find l p.lbls), l in let n = List.fold_left (fun n i -> size i + n) 0 p.text in let rev_lbls = Array.make n "" in Imap.iter (fun l (v,t) -> @@ -131,7 +132,8 @@ let print_program p = else printf "\n"; pc := !pc + 2 ) else ( - printf "%s\n" (bts w) ) in + printf "%s\n" (bts w); + incr pc ) in printf "%d %d\n" (n) 8; List.iter f p.text; printf "\n" -- cgit v1.2.3