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 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,28 +609,162 @@ 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]
}
}
}
}
}
@ -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)
}

View file

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

View file

@ -2,16 +2,16 @@
Stats: size=29 blocks=29 symbols=7 literals=0 relocations=0
Blocks
name start size #ins #dir #sto
<default> 0012C 0001D 5 10 1
<default> 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

View file

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

View file

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