drugi prehod 2.0
This commit is contained in:
parent
504df9b8fd
commit
dc71999c7d
12 changed files with 281 additions and 51 deletions
7
ass3/zbirnik/parsing/exp.asm
Normal file
7
ass3/zbirnik/parsing/exp.asm
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
mojprg START 0
|
||||
LDA @LAB
|
||||
LDA LAB
|
||||
LDA #12
|
||||
END mojprg
|
||||
halt J halt
|
||||
LAB WORD 2
|
||||
14
ass3/zbirnik/parsing/exp.log
Normal file
14
ass3/zbirnik/parsing/exp.log
Normal 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
|
||||
7
ass3/zbirnik/parsing/exp.lst
Normal file
7
ass3/zbirnik/parsing/exp.lst
Normal 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
|
||||
3
ass3/zbirnik/parsing/exp.obj
Normal file
3
ass3/zbirnik/parsing/exp.obj
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
Hmojprg00000000000F
|
||||
T0000000F02200903200601000C3F2FFD000002
|
||||
E000000
|
||||
20
ass3/zbirnik/parsing/input.log
Normal file
20
ass3/zbirnik/parsing/input.log
Normal 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
|
||||
32
ass3/zbirnik/parsing/input.lst
Normal file
32
ass3/zbirnik/parsing/input.lst
Normal 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
|
||||
5
ass3/zbirnik/parsing/input.obj
Normal file
5
ass3/zbirnik/parsing/input.obj
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
Harith 00000000004E
|
||||
T0000001E0320361B20360F203603202D1F202D0F20300320242320240F202A03201B
|
||||
T00001E1E27201B0F202403201523201E0F201E0320091F20180F20153F2FFD00000B
|
||||
T00003C03000005
|
||||
E000000
|
||||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
PRG START 300
|
||||
PRG START 0
|
||||
LDA #bytes_len
|
||||
DIV #3
|
||||
LDA bytes_len
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
HPRG00012C00001D
|
||||
T00012C0F0100092500030300096B20053F2FFD
|
||||
T00013D0C000001000002000003000001
|
||||
E00012C
|
||||
HPRG 00000000001D
|
||||
T0000000F0100092500030300096B20053F2FFD
|
||||
T0000110C000001000002000003000001
|
||||
E000000
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue