From dc71999c7dd2ad7639b3d6d3b8803f2945133111 Mon Sep 17 00:00:00 2001 From: "aljazbrodar." Date: Sat, 17 Jan 2026 11:22:35 +0100 Subject: [PATCH] drugi prehod 2.0 --- ass3/zbirnik/parsing/exp.asm | 7 + ass3/zbirnik/parsing/exp.log | 14 ++ ass3/zbirnik/parsing/exp.lst | 7 + ass3/zbirnik/parsing/exp.obj | 3 + ass3/zbirnik/parsing/input.log | 20 +++ ass3/zbirnik/parsing/input.lst | 32 +++++ ass3/zbirnik/parsing/input.obj | 5 + ass3/zbirnik/parsing/pregledovalnik.go | 188 ++++++++++++++++++++++--- ass3/zbirnik/parsing/test.asm | 2 +- ass3/zbirnik/parsing/test.log | 14 +- ass3/zbirnik/parsing/test.lst | 32 ++--- ass3/zbirnik/parsing/test.obj | 8 +- 12 files changed, 281 insertions(+), 51 deletions(-) create mode 100644 ass3/zbirnik/parsing/exp.asm create mode 100644 ass3/zbirnik/parsing/exp.log create mode 100644 ass3/zbirnik/parsing/exp.lst create mode 100644 ass3/zbirnik/parsing/exp.obj create mode 100644 ass3/zbirnik/parsing/input.log create mode 100644 ass3/zbirnik/parsing/input.lst create mode 100644 ass3/zbirnik/parsing/input.obj diff --git a/ass3/zbirnik/parsing/exp.asm b/ass3/zbirnik/parsing/exp.asm new file mode 100644 index 0000000..a548e81 --- /dev/null +++ b/ass3/zbirnik/parsing/exp.asm @@ -0,0 +1,7 @@ +mojprg START 0 + LDA @LAB + LDA LAB + LDA #12 + END mojprg +halt J halt +LAB WORD 2 diff --git a/ass3/zbirnik/parsing/exp.log b/ass3/zbirnik/parsing/exp.log new file mode 100644 index 0000000..1060fe3 --- /dev/null +++ b/ass3/zbirnik/parsing/exp.log @@ -0,0 +1,14 @@ +***** Section ***** +Stats: size=15 blocks=15 symbols=3 literals=0 relocations=0 +Blocks + name start size #ins #dir #sto + 00000 0000F 4 3 0 +Symbols + name hex dec scope kind type description + LAB 00000C 12 local relative data label + halt 000009 9 local relative code label + mojprg 000000 0 exported relative code label +Literals + label definition +Relocations + address length flag symbol diff --git a/ass3/zbirnik/parsing/exp.lst b/ass3/zbirnik/parsing/exp.lst new file mode 100644 index 0000000..a3af46d --- /dev/null +++ b/ass3/zbirnik/parsing/exp.lst @@ -0,0 +1,7 @@ +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 diff --git a/ass3/zbirnik/parsing/exp.obj b/ass3/zbirnik/parsing/exp.obj new file mode 100644 index 0000000..72bc5aa --- /dev/null +++ b/ass3/zbirnik/parsing/exp.obj @@ -0,0 +1,3 @@ +Hmojprg00000000000F +T0000000F02200903200601000C3F2FFD000002 +E000000 diff --git a/ass3/zbirnik/parsing/input.log b/ass3/zbirnik/parsing/input.log new file mode 100644 index 0000000..c94c04b --- /dev/null +++ b/ass3/zbirnik/parsing/input.log @@ -0,0 +1,20 @@ +***** Section ***** +Stats: size=78 blocks=78 symbols=9 literals=0 relocations=0 +Blocks + name start size #ins #dir #sto + 00000 0004E 19 4 5 +Symbols + name hex dec scope kind type description + HALT 000036 54 local relative code label + arith 000000 0 exported relative code label + diff 000042 66 local relative data label + mod 00004B 75 local relative data label + prod 000045 69 local relative data label + quot 000048 72 local relative data label + sum 00003F 63 local relative data label + x 000039 57 local relative data label + y 00003C 60 local relative data label +Literals + label definition +Relocations + address length flag symbol diff --git a/ass3/zbirnik/parsing/input.lst b/ass3/zbirnik/parsing/input.lst new file mode 100644 index 0000000..9f9889e --- /dev/null +++ b/ass3/zbirnik/parsing/input.lst @@ -0,0 +1,32 @@ +00000 arith START 0 +00000 032036 LDA x +00003 1B2036 ADD y +00006 0F2036 STA sum +00009 03202D LDA x +0000C 1F202D SUB y +0000F 0F2030 STA diff + +00012 032024 LDA x +00015 232024 MUL y +00018 0F202A STA prod + +0001B 03201B LDA x +0001E 27201B DIV y +00021 0F2024 STA quot + +00024 032015 LDA y +00027 23201E MUL quot +0002A 0F201E STA mod +0002D 032009 LDA x +00030 1F2018 SUB mod +00033 0F2015 STA mod +00036 3F2FFD HALT J HALT +00039 END arith + +00039 00000B x WORD 11 +0003C 000005 y WORD 5 +0003F 000000 sum RESW 1 +00042 000000 diff RESW 1 +00045 000000 prod RESW 1 +00048 000000 quot RESW 1 +0004B 000000 mod RESW 1 diff --git a/ass3/zbirnik/parsing/input.obj b/ass3/zbirnik/parsing/input.obj new file mode 100644 index 0000000..0f49c8f --- /dev/null +++ b/ass3/zbirnik/parsing/input.obj @@ -0,0 +1,5 @@ +Harith 00000000004E +T0000001E0320361B20360F203603202D1F202D0F20300320242320240F202A03201B +T00001E1E27201B0F202403201523201E0F201E0320091F20180F20153F2FFD00000B +T00003C03000005 +E000000 diff --git a/ass3/zbirnik/parsing/pregledovalnik.go b/ass3/zbirnik/parsing/pregledovalnik.go index 5e6c488..b1560a7 100644 --- a/ass3/zbirnik/parsing/pregledovalnik.go +++ b/ass3/zbirnik/parsing/pregledovalnik.go @@ -76,6 +76,12 @@ var ime_programa string var lc_global int +var bazno_dovoljeno bool + +var bazno_naslov int + +var zacetni_naslov int + type ukaz interface { GetOznaka() string } @@ -146,6 +152,7 @@ type format_F3_m struct { format int // 3 velikost int naslov string + odmik int x bool b bool p bool @@ -161,6 +168,7 @@ type format_F4_m struct { format int // 4 velikost int naslov string + odmik int x bool b bool p bool @@ -203,7 +211,6 @@ type format_M_i struct { format int // 9 velikost int operand string - rezervacija int lc int } @@ -382,7 +389,7 @@ func check_F2_rr(el string, AST *[]ukaz) bool { } func check_F3_m(el string, AST *[]ukaz) bool { - match_F3_m, err := regexp.MatchString(`(?m)^[A-Za-z_]*[\t ]+[A-Za-z]+ ([A-Za-z]+|(#?|@?)[0-9+]+)(, X)?[\t ]*(\..*)?$\n`, el) + match_F3_m, err := regexp.MatchString(`(?m)^[A-Za-z_]*[\t ]+[A-Za-z]+ ((#?|@?)[A-Za-z]+|(#?|@?)[0-9+]+)(, X)?[\t ]*(\..*)?$\n`, el) if err != nil { fmt.Println("Error while matching string.") } @@ -404,7 +411,7 @@ func check_F3_m(el string, AST *[]ukaz) bool { } nov_ukaz.opcode = val // naslov - re_par1 := regexp.MustCompile(`[\t ]+[A-Za-z]+ ([A-Za-z]+|(#?|@?)[0-9+]+)`) + re_par1 := regexp.MustCompile(`[\t ]+[A-Za-z]+ ((#?|@?)[A-Za-z]+|(#?|@?)[0-9+]+)`) nov_ukaz.naslov = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1] if nov_ukaz.naslov[0] == '@' { nov_ukaz.n = true @@ -416,8 +423,8 @@ func check_F3_m(el string, AST *[]ukaz) bool { nov_ukaz.naslov = nov_ukaz.naslov[1:len(nov_ukaz.naslov)] } else { //temp - nov_ukaz.n = false - nov_ukaz.i = false + nov_ukaz.n = true + nov_ukaz.i = true } // indeksno naslavljanje re_x := regexp.MustCompile(`(, X)[\t ]*(\..*)?\n`) @@ -435,7 +442,7 @@ func check_F3_m(el string, AST *[]ukaz) bool { } func check_F4_m(el string, AST *[]ukaz) bool { - match_F4_m, err := regexp.MatchString(`(?m)^[A-Za-z_]*[\t ]+\+[A-Za-z]+ ([A-Za-z]+|(#?|@?)[0-9+]+)(, X)?[\t ]*(\..*)?$\n`, el) + match_F4_m, err := regexp.MatchString(`(?m)^[A-Za-z_]*[\t ]+\+[A-Za-z]+ ((#?|@?)[A-Za-z]+|(#?|@?)[0-9+]+)(, X)?[\t ]*(\..*)?$\n`, el) if err != nil { fmt.Println("Error while matching string.") } @@ -458,7 +465,7 @@ func check_F4_m(el string, AST *[]ukaz) bool { } nov_ukaz.opcode = val // naslov - re_par1 := regexp.MustCompile(`[\t ]+\+[A-Za-z]+ ([A-Za-z]+|(#?|@?)[0-9+]+)`) + re_par1 := regexp.MustCompile(`[\t ]+\+[A-Za-z]+ ((#?|@?)[A-Za-z]+|(#?|@?)[0-9+]+)`) nov_ukaz.naslov = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1] if nov_ukaz.naslov[0] == '@' { nov_ukaz.n = true @@ -469,8 +476,8 @@ func check_F4_m(el string, AST *[]ukaz) bool { nov_ukaz.i = true nov_ukaz.naslov = nov_ukaz.naslov[1:len(nov_ukaz.naslov)] } else { - nov_ukaz.n = false - nov_ukaz.i = false + nov_ukaz.n = true + nov_ukaz.i = true } // indeksno naslavljanje re_x := regexp.MustCompile(`(, X)[\t ]*(\..*)?\n`) @@ -586,13 +593,10 @@ func check_M_i(el string, AST *[]ukaz) bool { } re_ope := regexp.MustCompile(`[0-9]+`) nova_direktiva.operand = re_ope.FindString(el) - operand_int, _ := strconv.Atoi(nova_direktiva.operand) if nova_direktiva.ime == "WORD" { nova_direktiva.velikost = 3 - nova_direktiva.rezervacija = 3 * operand_int } else { nova_direktiva.velikost = 1 - nova_direktiva.rezervacija = operand_int } //fmt.Println(el, nova_direktiva) *AST = append(*AST, &nova_direktiva) @@ -605,32 +609,166 @@ func prvi_prehod(AST *[]ukaz) { lc_global, _ = strconv.Atoi((*AST)[0].(*format_D_n).operand) ime_programa = (*AST)[0].(*format_D_n).oznaka for _, el := range *AST { - fmt.Println("lc_global", lc_global) + //fmt.Printf("lc_global '%x'\n", lc_global) switch val := el.(type) { case *format_F1: val.lc = lc_global - lc_global += 1 + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + lc_global += val.velikost case *format_F2_n: val.lc = lc_global - lc_global += 2 + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + lc_global += val.velikost case *format_F2_r: val.lc = lc_global - lc_global += 2 + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + lc_global += val.velikost case *format_F2_rn: val.lc = lc_global - lc_global += 2 + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + lc_global += val.velikost case *format_F2_rr: val.lc = lc_global - lc_global += 2 + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + lc_global += val.velikost case *format_F3_m: val.lc = lc_global - lc_global += 3 + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + lc_global += val.velikost + if bazno_dovoljeno { + val.b = true + } case *format_F4_m: val.lc = lc_global - lc_global += 4 + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + lc_global += val.velikost + if bazno_dovoljeno { + val.b = true + } case *format_D: val.lc = lc_global + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + bazno_dovoljeno = false case *format_D_n: val.lc = lc_global + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + switch val.ime { + case "ORG": inc, _ := strconv.Atoi(val.operand) + lc_global += inc + case "BASE": bazno_dovoljeno = true + } case *format_M_r: val.lc = lc_global + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } lc_global += val.rezervacija case *format_M_i: val.lc = lc_global - lc_global += val.rezervacija + if val.oznaka != "" { + simbolna_tabela[val.oznaka] = lc_global + } + lc_global += val.velikost } } } + +func drugi_prehod(AST *[]ukaz) { + for _, el := range *AST { + switch val := el.(type) { + case *format_F3_m: if st, err := strconv.Atoi(val.naslov); err == nil { + if val.n && !val.i { + if st >= -2048 && st <= 2047 { + val.odmik = st - (val.lc + val.velikost) //naslov - PC + } else if bazno_dovoljeno && st >= 0 && st <= 4095 { + val.odmik = st - bazno_naslov + } else { + val.odmik = st + } + } else if !val.n && val.i { + val.odmik = st + } else if val.n && val.i { + if st >= -2048 && st <= 2047 { + val.odmik = st - (val.lc + val.velikost) //naslov - PC + } else if bazno_dovoljeno && st >= 0 && st <= 4095 { + val.odmik = st - bazno_naslov + } else { + val.odmik = st + } + } + } else { + naslov := simbolna_tabela[val.naslov] + if val.n && !val.i { + if naslov >= -2048 && naslov <= 2047 { + val.odmik = naslov - (val.lc + val.velikost) //naslov - PC + } else if bazno_dovoljeno && naslov >= 0 && naslov <= 4095 { + val.odmik = naslov - bazno_naslov + } else { + val.odmik = naslov + } + } else if !val.n && val.i { + val.odmik = naslov + } else if val.n && val.i { + if naslov >= -2048 && naslov <= 2047 { + val.odmik = naslov - (val.lc + val.velikost) //naslov - PC + //fmt.Printf("pc %x\n", val.odmik) + } else if bazno_dovoljeno && naslov >= 0 && naslov <= 4095 { + val.odmik = naslov - bazno_naslov + //fmt.Printf("bazno %x\n", val.odmik) + } else { + val.odmik = naslov + //fmt.Printf("neposredno %x\n", val.odmik) + } + } + } + case *format_F4_m: if st, err := strconv.Atoi(val.naslov); err == nil { + if val.n && !val.i { + + } else if !val.n && val.i { + + } else if val.n && val.i { + + } + } else { + if val.n && !val.i { + + } else if !val.n && val.i { + + } else if val.n && val.i { + + } + } + case *format_D: bazno_dovoljeno = false + case *format_D_n: switch val.ime { + case "BASE": bazno_dovoljeno = true + if st, err := strconv.Atoi(val.operand); err == nil { + bazno_naslov = st + } else { + bazno_naslov = simbolna_tabela[val.operand] + } + case "END": if st, err := strconv.Atoi(val.operand); err == nil { + zacetni_naslov = st + } else { + zacetni_naslov = simbolna_tabela[val.operand] + } + case "EQU": if st, err := strconv.Atoi(val.operand); err == nil { + simbolna_tabela[val.oznaka] = st + } else { + simbolna_tabela[val.oznaka] = simbolna_tabela[val.operand] + } + } + } + } +} + func izpis(AST *[]ukaz) { for _, el := range *AST { switch val := el.(type) { @@ -703,6 +841,10 @@ func main() { } } prvi_prehod(&AST) - izpis(&AST) - //drugi_prehod() + //izpis(&AST) + /*for k, v := range simbolna_tabela { + fmt.Printf("k: %s v: %x\n", k, v) + }*/ + drugi_prehod(&AST) + //izpis(&AST) } diff --git a/ass3/zbirnik/parsing/test.asm b/ass3/zbirnik/parsing/test.asm index 99d45f3..af8c1ad 100644 --- a/ass3/zbirnik/parsing/test.asm +++ b/ass3/zbirnik/parsing/test.asm @@ -1,4 +1,4 @@ -PRG START 300 +PRG START 0 LDA #bytes_len DIV #3 LDA bytes_len diff --git a/ass3/zbirnik/parsing/test.log b/ass3/zbirnik/parsing/test.log index a68a4fa..81e070c 100644 --- a/ass3/zbirnik/parsing/test.log +++ b/ass3/zbirnik/parsing/test.log @@ -2,16 +2,16 @@ Stats: size=29 blocks=29 symbols=7 literals=0 relocations=0 Blocks name start size #ins #dir #sto - 0012C 0001D 5 10 1 + 00000 0001D 5 10 1 Symbols name hex dec scope kind type description - HALT 000138 312 local relative code label - PRG 00012C 300 exported relative code label + HALT 00000C 12 local relative code label + PRG 000000 0 exported relative code label bytes_len 000009 9 local absolute notlabel test-tab - tab 00013D 317 local relative data label - tab0 00013B 315 local relative data label - tab2 000146 326 local relative data label - test 000146 326 local absolute notlabel * + tab 000011 17 local relative data label + tab0 00000F 15 local relative data label + tab2 00001A 26 local relative data label + test 00001A 26 local absolute notlabel * Literals label definition Relocations diff --git a/ass3/zbirnik/parsing/test.lst b/ass3/zbirnik/parsing/test.lst index 9f1e5a5..a52d555 100644 --- a/ass3/zbirnik/parsing/test.lst +++ b/ass3/zbirnik/parsing/test.lst @@ -1,17 +1,17 @@ -0012C PRG START 300 -0012C 010009 LDA #bytes_len -0012F 250003 DIV #3 -00132 030009 LDA bytes_len -00135 6B2005 LDB tab -00135 BASE tab -00135 NOBASE -00138 3F2FFD HALT J HALT -0013B END PRG +00000 PRG START 0 +00000 010009 LDA #bytes_len +00003 250003 DIV #3 +00006 030009 LDA bytes_len +00009 6B2005 LDB tab +00009 BASE tab +00009 NOBASE +0000C 3F2FFD HALT J HALT +0000F END PRG -0013B 0000 tab0 RESB 2 -0013D 000001 tab WORD 1 -00140 000002 WORD 2 -00143 000003 WORD 3 -00146 test EQU * -00146 bytes_len EQU test-tab -00146 000001 tab2 WORD 1 +0000F 0000 tab0 RESB 2 +00011 000001 tab WORD 1 +00014 000002 WORD 2 +00017 000003 WORD 3 +0001A test EQU * +0001A bytes_len EQU test-tab +0001A 000001 tab2 WORD 1 diff --git a/ass3/zbirnik/parsing/test.obj b/ass3/zbirnik/parsing/test.obj index 653badd..924a004 100644 --- a/ass3/zbirnik/parsing/test.obj +++ b/ass3/zbirnik/parsing/test.obj @@ -1,4 +1,4 @@ -HPRG00012C00001D -T00012C0F0100092500030300096B20053F2FFD -T00013D0C000001000002000003000001 -E00012C +HPRG 00000000001D +T0000000F0100092500030300096B20053F2FFD +T0000110C000001000002000003000001 +E000000