Mercurial > hg > ede
changeset 19:c9fbeb852ff2
unmangled if/elif/else structures in assembler
author | james <jb302@eecs.qmul.ac.uk> |
---|---|
date | Sun, 23 Feb 2014 14:47:41 +0000 |
parents | 256d24488e3f |
children | ddeae9d3fff4 |
files | assembler/.assembler.py.swp assembler/assembler.py assembler/language.py assembler/language.pyc |
diffstat | 4 files changed, 70 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/assembler/assembler.py Sat Feb 22 20:30:58 2014 +0000 +++ b/assembler/assembler.py Sun Feb 23 14:47:41 2014 +0000 @@ -58,9 +58,8 @@ if (len(statement) >= 3) and (statement[1] == 'equ'): equ_index[statement[0]] = statement[2] continue - # if needed update index and remove label - if statement[0][-1:] == ':': + elif statement[0][-1:] == ':': label_index[statement[0][:-1]] = pc; del statement[0] @@ -88,10 +87,14 @@ except: print ' ** first pass error **\nline:\n', line raise - + return asm, label_index # take preprocessed asm and write machine code to binary file +# for each line of asm +# check if it's an org or db command deal with it accordingly +# check if arguments are labels and replace with value +# write instruction to file def second_pass(f, asm, label_index): pc = 0 @@ -116,21 +119,25 @@ for a in args: if not a: continue - # labeled pointer uglyness - elif (a[0] == '@') and (a[1:] in label_index): - args[i] = '@' + num_string(label_index[a[1:]]) - const = const + tokenize([args[i]])[1] - elif a in label_index: - # check if constant needs to be a relative address - r = list(sym) - r.insert(i, 'rel8') - r.pop(i + 1) - if tuple(r) in iset[mne].keys(): - # relative addresses can be negative - args[i] = num_string(label_index[a] - pc) + elif (sym[i] == 'label') or (sym[i] == '@label'): + # labeled pointer uglyness + if (a[0] == '@') and (a[1:] in label_index): + args[i] = '@' + num_string(label_index[a[1:]]) + const = const + tokenize([args[i]])[1] + elif a in label_index: + # check if constant needs to be a relative address + r = list(sym) + r.insert(i, 'rel8') + r.pop(i + 1) + if tuple(r) in iset[mne].keys(): + # relative addresses can be negative + args[i] = num_string(label_index[a] - pc) + else: + args[i] = num_string(label_index[a]) + const = const + tokenize([args[i]])[1] else: - args[i] = num_string(label_index[a]) - const = const + tokenize([args[i]])[1] + print '** label error **\nline:\n', line + raise i = i + 1 # assemble to file
--- a/assembler/language.py Sat Feb 22 20:30:58 2014 +0000 +++ b/assembler/language.py Sun Feb 23 14:47:41 2014 +0000 @@ -274,19 +274,50 @@ data = '' i = 0 - for a in args: - + + # things that can't be negative is_neg = 0 # reserved words if a in vargs: sym.append(a) continue - # check if value is negative and remove sign + # 16 bit addresses + elif (a[:2] == PREFIX) and (2 < len(a[2:]) <= 4): + sym.append('addr16') + val = string_num(a) + data = data + struct.pack('>H', val) + continue + # pointers + elif a[0] == '@': + if a[:3] == '@' + PREFIX: + sym.append('@addr16') + val = string_num(a[1:]) + data = data + struct.pack('>H', val) + continue + # labeled pointers make for ugly code considering + # only two instructions can use them + else: + sym.append('@label') + continue + # ports + elif a[:3] == 'p' + PREFIX: + sym.append('port_addr') + val = string_num(a[1:]) + data = data + struct.pack('>B', val) + continue + # vectors + elif a[:3] == 'v' + PREFIX: + sym.append('vect8') + val = string_num(a[1:]) + data = data + struct.pack('>B', val) + continue + # check if other values are negative and remove sign elif a[0] == '-': a = a[1:] is_neg = 1 + # things that can be negative # immediate ints if (a[:3] == '#' + PREFIX): # 8 bit ints @@ -298,6 +329,7 @@ val = string_num(a[1:]) # signed big-endian byte data = data + struct.pack('>b', val) + continue # 16 bit ints elif len(a[3:]) <= 4: sym.append('#data16') @@ -307,45 +339,21 @@ val = string_num(a[1:]) # signed big-endian short data = data + struct.pack('>h', val) - # addresses - elif (a[:2] == PREFIX): - # 8 bit addresses - if len(a[2:]) <= 2: - sym.append('rel8') - if is_neg: - val = string_num('-' + a) - else: - val = string_num(a) - # signed - data = data + struct.pack('>b', val) - # 16 bit addresses - elif len(a[2:]) <= 4: - sym.append('addr16') + continue + # 8 bit relative addresses + elif (a[:2] == PREFIX) and (len(a[2:]) <= 2): + sym.append('rel8') + if is_neg: + val = string_num('-' + a) + else: val = string_num(a) - data = data + struct.pack('>H', val) - # pointers - elif a[0] == '@': - if a[:3] == '@' + PREFIX: - sym.append('@addr16') - val = string_num(a[1:]) - data = data + struct.pack('>H', val) - # labeled pointers make for ugly code considering - # only two instructions can use them - else: - sym.append('@label') - # ports - elif a[:3] == 'p' + PREFIX: - sym.append('port_addr') - val = string_num(a[1:]) - data = data + struct.pack('>B', val) - # vectors - elif a[:3] == 'v' + PREFIX: - sym.append('vect8') - val = string_num(a[1:]) - data = data + struct.pack('>B', val) + # signed + data = data + struct.pack('>b', val) + continue # unknown strings are either labels or source code errors else: sym.append('label') + continue return tuple(sym), data