diff --git a/ass3/zbirnik/parsing/exp.asm b/ass3/zbirnik/parsing/exp.asm index a548e81..34d440e 100644 --- a/ass3/zbirnik/parsing/exp.asm +++ b/ass3/zbirnik/parsing/exp.asm @@ -1,7 +1,10 @@ mojprg START 0 + CLEAR B LDA @LAB - LDA LAB + LDB LAB LDA #12 END mojprg halt J halt LAB WORD 2 +LAB2 RESW 3 +LAB3 WORD 3 diff --git a/ass3/zbirnik/parsing/exp.log b/ass3/zbirnik/parsing/exp.log index 1060fe3..66f0f24 100644 --- a/ass3/zbirnik/parsing/exp.log +++ b/ass3/zbirnik/parsing/exp.log @@ -1,12 +1,14 @@ ***** Section ***** -Stats: size=15 blocks=15 symbols=3 literals=0 relocations=0 +Stats: size=29 blocks=29 symbols=5 literals=0 relocations=0 Blocks name start size #ins #dir #sto - 00000 0000F 4 3 0 + 00000 0001D 5 4 1 Symbols name hex dec scope kind type description - LAB 00000C 12 local relative data label - halt 000009 9 local relative code label + LAB 00000E 14 local relative data label + LAB2 000011 17 local relative data label + LAB3 00001A 26 local relative data label + halt 00000B 11 local relative code label mojprg 000000 0 exported relative code label Literals label definition diff --git a/ass3/zbirnik/parsing/exp.lst b/ass3/zbirnik/parsing/exp.lst index a3af46d..3a2de84 100644 --- a/ass3/zbirnik/parsing/exp.lst +++ b/ass3/zbirnik/parsing/exp.lst @@ -1,7 +1,10 @@ 00000 mojprg START 0 -00000 022009 LDA @LAB -00003 032006 LDA LAB -00006 01000C LDA #12 -00009 END mojprg -00009 3F2FFD halt J halt -0000C 000002 LAB WORD 2 +00000 B430 CLEAR B +00002 022009 LDA @LAB +00005 6B2006 LDB LAB +00008 01000C LDA #12 +0000B END mojprg +0000B 3F2FFD halt J halt +0000E 000002 LAB WORD 2 +00011 00....00 LAB2 RESW 3 +0001A 000003 LAB3 WORD 3 diff --git a/ass3/zbirnik/parsing/exp.obj b/ass3/zbirnik/parsing/exp.obj index 72bc5aa..131e607 100644 --- a/ass3/zbirnik/parsing/exp.obj +++ b/ass3/zbirnik/parsing/exp.obj @@ -1,3 +1,4 @@ -Hmojprg00000000000F -T0000000F02200903200601000C3F2FFD000002 +Hmojprg00000000001D +T00000011B4300220096B200601000C3F2FFD000002 +T00001A03000003 E000000 diff --git a/ass3/zbirnik/parsing/out.obj b/ass3/zbirnik/parsing/out.obj new file mode 100644 index 0000000..e69de29 diff --git a/ass3/zbirnik/parsing/pregledovalnik.go b/ass3/zbirnik/parsing/pregledovalnik.go index b759b94..ce0d78c 100644 --- a/ass3/zbirnik/parsing/pregledovalnik.go +++ b/ass3/zbirnik/parsing/pregledovalnik.go @@ -8,6 +8,16 @@ import ( "strconv" ) +var register_map = map[string]int{ + "A": 0, + "X": 1, + "L": 2, + "B": 3, + "S": 4, + "T": 5, + "F": 6, +} + var ukazna_tabela = map[string]int{ "ADD": 0x18, "ADDF": 0x58, @@ -85,20 +95,33 @@ var naslov_programa int var zacetni_naslov int type ukaz interface { - GetOznaka() string + Velikost() int + GetAddr() int } -func (f *format_F1) GetOznaka() string { return f.oznaka } -func (f *format_F2_n) GetOznaka() string { return f.oznaka } -func (f *format_F2_r) GetOznaka() string { return f.oznaka } -func (f *format_F2_rn) GetOznaka() string { return f.oznaka } -func (f *format_F2_rr) GetOznaka() string { return f.oznaka } -func (f *format_F3_m) GetOznaka() string { return f.oznaka } -func (f *format_F4_m) GetOznaka() string { return f.oznaka } -func (f *format_D) GetOznaka() string { return f.oznaka } -func (f *format_D_n) GetOznaka() string { return f.oznaka } -func (f *format_M_i) GetOznaka() string { return f.oznaka } -func (f *format_M_r) GetOznaka() string { return f.oznaka } +func (f *format_F1) Velikost() int { return f.velikost } +func (f *format_F2_n) Velikost() int { return f.velikost } +func (f *format_F2_r) Velikost() int { return f.velikost } +func (f *format_F2_rn) Velikost() int { return f.velikost } +func (f *format_F2_rr) Velikost() int { return f.velikost } +func (f *format_F3_m) Velikost() int { return f.velikost } +func (f *format_F4_m) Velikost() int { return f.velikost } +func (f *format_D) Velikost() int { return f.velikost } +func (f *format_D_n) Velikost() int { return f.velikost } +func (f *format_M_i) Velikost() int { return f.velikost } +func (f *format_M_r) Velikost() int { return f.velikost } + +func (f *format_F1) GetAddr() int { return f.lc } +func (f *format_F2_n) GetAddr() int { return f.lc } +func (f *format_F2_r) GetAddr() int { return f.lc } +func (f *format_F2_rn) GetAddr() int { return f.lc } +func (f *format_F2_rr) GetAddr() int { return f.lc } +func (f *format_F3_m) GetAddr() int { return f.lc } +func (f *format_F4_m) GetAddr() int { return f.lc } +func (f *format_D) GetAddr() int { return f.lc } +func (f *format_D_n) GetAddr() int { return f.lc } +func (f *format_M_i) GetAddr() int { return f.lc } +func (f *format_M_r) GetAddr() int { return f.lc } var register string = `A|X|L|B|S|T|F` @@ -761,18 +784,96 @@ func drugi_prehod(AST *[]ukaz) { } func generacija(AST *[]ukaz) { - _, err := os.Create("out.obj") + obj, err := os.Create("out.obj") if err != nil { fmt.Println("Error creating a file: ", err) return } - defer file.Close() - switch - fmt.Println("H", ime_programa, naslov_programa, naslov_programa - lc_global + (*AST)[len(*AST) - 1].velikost) - + defer obj.Close() + fmt.Println("H", ime_programa, naslov_programa, lc_global + (*AST)[len(*AST) - 1].Velikost() - naslov_programa) + line_len := 0 + line := "" + line_addr := naslov_programa + for _, el := range *AST { + temp := "" + switch val := el.(type) { + case *format_F1: temp= fmt.Sprintf("%s%4x", temp, val.opcode) + case *format_F2_n: temp = fmt.Sprintf("%s%2x%x%x", temp, val.opcode, val.n, 0) + case *format_F2_r: temp = fmt.Sprintf("%s%2x%x%x", temp, val.opcode, register_map[val.r1], 0) + case *format_F2_rn: temp = fmt.Sprintf("%s%2x%x%x", temp, val.opcode, val.r1, val.n) + case *format_F2_rr: temp = fmt.Sprintf("%s%2x%x%x", temp, val.opcode, register_map[val.r1], register_map[val.r2]) + case *format_F3_m: n := 0 + i := 0 + x := 0 + b := 0 + p := 0 + e := 0 + if val.n { + n = 1 + } + if val.i { + i = 1 + } + if val.x { + x = 1 + } + if val.b { + b = 1 + } + if val.p { + p = 1 + } + if val.e { + e = 1 + } + temp = fmt.Sprintf("%s%2x%2x%2x", temp, val.opcode + (n << 1) + i, (x << 7) + (b << 6) + (p << 5) + (e << 4) + + (val.odmik & (0xF << 8)), val.odmik & 0xFF) + case *format_F4_m: n := 0 + i := 0 + x := 0 + b := 0 + p := 0 + e := 0 + if val.n { + n = 1 + } + if val.i { + i = 1 + } + if val.x { + x = 1 + } + if val.b { + b = 1 + } + if val.p { + p = 1 + } + if val.e { + e = 1 + } + temp = fmt.Sprintf("%s%2x%2x%2x%2x", temp, val.opcode + (n << 1) + i, (x << 7) + (b << 6) + (p << 5) + (e << 4) + + (val.odmik & (0xF << 16)), val.odmik & (0xFF << 8), val.odmik & 0xFF) + case *format_D: continue + case *format_D_n: if val.ime == "START" || val.ime == "END" { + continue + } + case *format_M_r: continue + case *format_M_i: vr, _ := strconv.Atoi(val.operand) + temp = fmt.Sprintf("%s%3x", temp, vr) + } + if line_len + el.Velikost() <= 30 { + line_len += el.Velikost() + line = fmt.Sprintf("%s%s", line, temp) + } else { + fmt.Printf("T: %x, %x, %s\n", line_addr, line_len, line) + line_len = el.Velikost() + line = temp + line_addr = el.GetAddr() + } + } } - func izpis(AST *[]ukaz) { for _, el := range *AST { switch val := el.(type) { @@ -805,7 +906,6 @@ func main() { pattern := regexp.MustCompile(`.*\n`) matches := pattern.FindAllString(input, -1) var AST []ukaz - for _, el := range matches { if remove_comments_and_empty_lines(el) { continue diff --git a/ass3/zbirnik/parsing/test.go b/ass3/zbirnik/parsing/test.go index ebeab4b..821aa3c 100644 --- a/ass3/zbirnik/parsing/test.go +++ b/ass3/zbirnik/parsing/test.go @@ -2,12 +2,9 @@ package main import ( "fmt" - "strconv" ) func main() { - test := "30" - var i int - i, _ = strconv.Atoi(test) - fmt.Println(i) + test := 65 + ((true ? 1 : 0) << 1) + ((true ? 1 : 0) << 0) + fmt.Println(test) }