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/asmpars.mly | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'asm/asmpars.mly') 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 } -- cgit v1.2.3