drugi prehod 2.0

This commit is contained in:
aljazbrodar. 2026-01-17 11:22:35 +01:00
parent 504df9b8fd
commit dc71999c7d
12 changed files with 281 additions and 51 deletions

View file

@ -0,0 +1,7 @@
mojprg START 0
LDA @LAB
LDA LAB
LDA #12
END mojprg
halt J halt
LAB WORD 2

View file

@ -0,0 +1,14 @@
***** Section <default> *****
Stats: size=15 blocks=15 symbols=3 literals=0 relocations=0
Blocks
name start size #ins #dir #sto
<default> 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

View file

@ -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

View file

@ -0,0 +1,3 @@
Hmojprg00000000000F
T0000000F02200903200601000C3F2FFD000002
E000000

View file

@ -0,0 +1,20 @@
***** Section <default> *****
Stats: size=78 blocks=78 symbols=9 literals=0 relocations=0
Blocks
name start size #ins #dir #sto
<default> 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

View file

@ -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

View file

@ -0,0 +1,5 @@
Harith 00000000004E
T0000001E0320361B20360F203603202D1F202D0F20300320242320240F202A03201B
T00001E1E27201B0F202403201523201E0F201E0320091F20180F20153F2FFD00000B
T00003C03000005
E000000

View file

@ -76,6 +76,12 @@ var ime_programa string
var lc_global int var lc_global int
var bazno_dovoljeno bool
var bazno_naslov int
var zacetni_naslov int
type ukaz interface { type ukaz interface {
GetOznaka() string GetOznaka() string
} }
@ -146,6 +152,7 @@ type format_F3_m struct {
format int // 3 format int // 3
velikost int velikost int
naslov string naslov string
odmik int
x bool x bool
b bool b bool
p bool p bool
@ -161,6 +168,7 @@ type format_F4_m struct {
format int // 4 format int // 4
velikost int velikost int
naslov string naslov string
odmik int
x bool x bool
b bool b bool
p bool p bool
@ -203,7 +211,6 @@ type format_M_i struct {
format int // 9 format int // 9
velikost int velikost int
operand string operand string
rezervacija int
lc 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 { 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 { if err != nil {
fmt.Println("Error while matching string.") fmt.Println("Error while matching string.")
} }
@ -404,7 +411,7 @@ func check_F3_m(el string, AST *[]ukaz) bool {
} }
nov_ukaz.opcode = val nov_ukaz.opcode = val
// naslov // 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] nov_ukaz.naslov = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1]
if nov_ukaz.naslov[0] == '@' { if nov_ukaz.naslov[0] == '@' {
nov_ukaz.n = true 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)] nov_ukaz.naslov = nov_ukaz.naslov[1:len(nov_ukaz.naslov)]
} else { } else {
//temp //temp
nov_ukaz.n = false nov_ukaz.n = true
nov_ukaz.i = false nov_ukaz.i = true
} }
// indeksno naslavljanje // indeksno naslavljanje
re_x := regexp.MustCompile(`(, X)[\t ]*(\..*)?\n`) 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 { 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 { if err != nil {
fmt.Println("Error while matching string.") fmt.Println("Error while matching string.")
} }
@ -458,7 +465,7 @@ func check_F4_m(el string, AST *[]ukaz) bool {
} }
nov_ukaz.opcode = val nov_ukaz.opcode = val
// naslov // 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] nov_ukaz.naslov = strings.Split(strings.Trim(re_par1.FindString(el), "\t \n"), " ")[1]
if nov_ukaz.naslov[0] == '@' { if nov_ukaz.naslov[0] == '@' {
nov_ukaz.n = true nov_ukaz.n = true
@ -469,8 +476,8 @@ func check_F4_m(el string, AST *[]ukaz) bool {
nov_ukaz.i = true nov_ukaz.i = true
nov_ukaz.naslov = nov_ukaz.naslov[1:len(nov_ukaz.naslov)] nov_ukaz.naslov = nov_ukaz.naslov[1:len(nov_ukaz.naslov)]
} else { } else {
nov_ukaz.n = false nov_ukaz.n = true
nov_ukaz.i = false nov_ukaz.i = true
} }
// indeksno naslavljanje // indeksno naslavljanje
re_x := regexp.MustCompile(`(, X)[\t ]*(\..*)?\n`) 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]+`) re_ope := regexp.MustCompile(`[0-9]+`)
nova_direktiva.operand = re_ope.FindString(el) nova_direktiva.operand = re_ope.FindString(el)
operand_int, _ := strconv.Atoi(nova_direktiva.operand)
if nova_direktiva.ime == "WORD" { if nova_direktiva.ime == "WORD" {
nova_direktiva.velikost = 3 nova_direktiva.velikost = 3
nova_direktiva.rezervacija = 3 * operand_int
} else { } else {
nova_direktiva.velikost = 1 nova_direktiva.velikost = 1
nova_direktiva.rezervacija = operand_int
} }
//fmt.Println(el, nova_direktiva) //fmt.Println(el, nova_direktiva)
*AST = append(*AST, &nova_direktiva) *AST = append(*AST, &nova_direktiva)
@ -605,28 +609,162 @@ func prvi_prehod(AST *[]ukaz) {
lc_global, _ = strconv.Atoi((*AST)[0].(*format_D_n).operand) lc_global, _ = strconv.Atoi((*AST)[0].(*format_D_n).operand)
ime_programa = (*AST)[0].(*format_D_n).oznaka ime_programa = (*AST)[0].(*format_D_n).oznaka
for _, el := range *AST { for _, el := range *AST {
fmt.Println("lc_global", lc_global) //fmt.Printf("lc_global '%x'\n", lc_global)
switch val := el.(type) { switch val := el.(type) {
case *format_F1: val.lc = lc_global 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 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 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 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 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 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 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 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 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 case *format_M_r: val.lc = lc_global
if val.oznaka != "" {
simbolna_tabela[val.oznaka] = lc_global
}
lc_global += val.rezervacija lc_global += val.rezervacija
case *format_M_i: val.lc = lc_global 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]
}
}
} }
} }
} }
@ -703,6 +841,10 @@ func main() {
} }
} }
prvi_prehod(&AST) prvi_prehod(&AST)
izpis(&AST) //izpis(&AST)
//drugi_prehod() /*for k, v := range simbolna_tabela {
fmt.Printf("k: %s v: %x\n", k, v)
}*/
drugi_prehod(&AST)
//izpis(&AST)
} }

View file

@ -1,4 +1,4 @@
PRG START 300 PRG START 0
LDA #bytes_len LDA #bytes_len
DIV #3 DIV #3
LDA bytes_len LDA bytes_len

View file

@ -2,16 +2,16 @@
Stats: size=29 blocks=29 symbols=7 literals=0 relocations=0 Stats: size=29 blocks=29 symbols=7 literals=0 relocations=0
Blocks Blocks
name start size #ins #dir #sto name start size #ins #dir #sto
<default> 0012C 0001D 5 10 1 <default> 00000 0001D 5 10 1
Symbols Symbols
name hex dec scope kind type description name hex dec scope kind type description
HALT 000138 312 local relative code label HALT 00000C 12 local relative code label
PRG 00012C 300 exported relative code label PRG 000000 0 exported relative code label
bytes_len 000009 9 local absolute notlabel test-tab bytes_len 000009 9 local absolute notlabel test-tab
tab 00013D 317 local relative data label tab 000011 17 local relative data label
tab0 00013B 315 local relative data label tab0 00000F 15 local relative data label
tab2 000146 326 local relative data label tab2 00001A 26 local relative data label
test 000146 326 local absolute notlabel * test 00001A 26 local absolute notlabel *
Literals Literals
label definition label definition
Relocations Relocations

View file

@ -1,17 +1,17 @@
0012C PRG START 300 00000 PRG START 0
0012C 010009 LDA #bytes_len 00000 010009 LDA #bytes_len
0012F 250003 DIV #3 00003 250003 DIV #3
00132 030009 LDA bytes_len 00006 030009 LDA bytes_len
00135 6B2005 LDB tab 00009 6B2005 LDB tab
00135 BASE tab 00009 BASE tab
00135 NOBASE 00009 NOBASE
00138 3F2FFD HALT J HALT 0000C 3F2FFD HALT J HALT
0013B END PRG 0000F END PRG
0013B 0000 tab0 RESB 2 0000F 0000 tab0 RESB 2
0013D 000001 tab WORD 1 00011 000001 tab WORD 1
00140 000002 WORD 2 00014 000002 WORD 2
00143 000003 WORD 3 00017 000003 WORD 3
00146 test EQU * 0001A test EQU *
00146 bytes_len EQU test-tab 0001A bytes_len EQU test-tab
00146 000001 tab2 WORD 1 0001A 000001 tab2 WORD 1

View file

@ -1,4 +1,4 @@
HPRG00012C00001D HPRG 00000000001D
T00012C0F0100092500030300096B20053F2FFD T0000000F0100092500030300096B20053F2FFD
T00013D0C000001000002000003000001 T0000110C000001000002000003000001
E00012C E000000