asm
This commit is contained in:
117
asm/asm02.py
Normal file
117
asm/asm02.py
Normal file
@@ -0,0 +1,117 @@
|
||||
'''
|
||||
1. Kreieren der Symboltabelle
|
||||
2. Einlesen der Datei
|
||||
a. Entfernen der Kommentare -- erledigt
|
||||
b. Suchen der (Label) und Ablegen dieser in die Symboltabelle -- erledigt
|
||||
c. Entfernen der (Label) aus dem ASM-File
|
||||
d. HACK-Code erzeugen
|
||||
'''
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
import re
|
||||
from icecream import ic
|
||||
|
||||
symboltable = {}
|
||||
asm = []
|
||||
|
||||
def appendTable(table, id, item):
|
||||
print("appendTable ",id, " ", item )
|
||||
|
||||
table["@"+ str(item)] = id
|
||||
symboltable = table
|
||||
|
||||
|
||||
def createSymboltable():
|
||||
return {
|
||||
key: (value)
|
||||
for key, value in {
|
||||
**{'@SP': 0,
|
||||
'@LCL': 1,
|
||||
'@ARG': 2,
|
||||
'@THIS': 3,
|
||||
'@THAT': 4,
|
||||
'@SCREEN': 0x4000,
|
||||
'@KBD': 0x6000,},
|
||||
**{f'@R{i}': i
|
||||
for i in range(16)}
|
||||
}.items()}
|
||||
|
||||
def load_asm_file(filename):
|
||||
fp = open(filename, 'r')
|
||||
comment = r"^/"
|
||||
eol = r"^\n"
|
||||
tmp = []
|
||||
t = fp.readlines()
|
||||
for l in t:
|
||||
if re.match(comment, l):
|
||||
pass
|
||||
elif re.match(eol, l):
|
||||
pass
|
||||
else:
|
||||
tmp.append(re.sub('\s', '', l).split('//')[0]) # Wenn noch ein Kommentar hinter der Anweisung steht dann Abtrenen
|
||||
fp.close()
|
||||
#ic("tmp = ", tmp)
|
||||
return tmp
|
||||
|
||||
def label_to_symboltable(data):
|
||||
#ic(len(data))
|
||||
i = 0
|
||||
tmp = {}
|
||||
for l in data:
|
||||
if (l.startswith('(') and l.endswith(')')):
|
||||
l = l[:-1]
|
||||
l = l.lstrip('(')
|
||||
tmp['@'+str(l)] = i
|
||||
#ic(l)
|
||||
else:
|
||||
i=i+1
|
||||
|
||||
if len(tmp) != 0:
|
||||
symboltable.update(tmp)
|
||||
#ic(symboltable)
|
||||
#ic (data)
|
||||
|
||||
# c. Löschen der (Label) aus der Liste
|
||||
count = 0
|
||||
for i in tmp:
|
||||
#ic(tmp[i]) # Zeilennummern
|
||||
data.pop(tmp[i]-count)
|
||||
|
||||
#ic(len(data))
|
||||
searchSymbols(data)
|
||||
|
||||
|
||||
|
||||
def searchSymbols(asm):
|
||||
'''
|
||||
wenn Zeile mit @ beginnt schauen ob Variable in Symboltable
|
||||
sonst
|
||||
ist Variable @x ein int, dann ohne @ in die Symboltable übernehmen
|
||||
'''
|
||||
#ic(asm)
|
||||
i = 0
|
||||
for line in asm:
|
||||
if line.startswith('@'):
|
||||
ic (i, " ",line[1:])
|
||||
if line[1:].isdigit():
|
||||
ic(line[1:], " ist ein int")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
#filename = sys.argv[1]
|
||||
filename = "Rect.asm"
|
||||
symboltable = createSymboltable()
|
||||
asm = load_asm_file(filename)
|
||||
label_to_symboltable(asm)
|
||||
searchSymbols(asm)
|
||||
|
||||
#print("Symtable = ",symboltable)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user