#!/usr/bin/env python """ assembler.py: rather primitive two-pass assembler. Get the labels, then assemble the instructions. """ import re import sys import optparse symbols = {} instructions = [] relocations = [] class AssemblerError(Exception): pass class AssemblerSyntaxError(AssemblerError): def __init__(self,line,reason): self.line = line self.reason = reason def __str__(self): return "Syntax error on line %d: %s" % (self.line,self.reason) class AssemblerRangeError(AssemblerError): def __init__(self,line,reason): self.line = line self.reason = reason def __str__(self): return "Range error on line %d: %s" % (self.line,self.reason) labelre = re.compile(r"""^(?P.*:)?(?P[^:]*)$""") commentre = re.compile(r"""^(?P[^#]*)(?P#.*)?$""") alnumunderre = re.compile(r"""^\w+$""") rtype_re = re.compile(r'''^(?P(or|and|add|sub|sllv|srlv|srav|slt))\s+(?P\$r[0,1,2,3])\s+(?P\$r[0,1,2,3])\s+(?P\$r[0,1,2,3])$''') immed_re = re.compile(r'''^(?P(ori|addi|andi))\s+(?P\$r[0,1,2,3])\s+(?P\$r[0,1,2,3])\s+(?P-?(0x)?[0-9a-fA-F]+)$''') lui_re = re.compile(r'''^(?Plui)\s+(?P\$r[0,1,2,3])\s+(?P-?(0x)?[0-9a-fA-F]+)$''') disp_re = re.compile(r'''^(?Pdisp)\s+(?P\$r[0,1,2,3])\s+(?P-?(0x)?[0-9a-fA-F]+)$''') mem_re = re.compile(r'''^(?P(lw|sw))\s+(?P\$r[0,1,2,3])\s+(?P-?(0x)?[0-9a-fA-F]+)\s*\(\s*(?P\$r[0,1,2,3])\s*\)$''') j_re = re.compile(r'''^(?P(j|jal))\s+(?P