diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2022-01-26 21:36:44 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2022-01-26 21:36:44 +0100 |
| commit | 2ea7eec53978ff743e73b83c4adab942914b0438 (patch) | |
| tree | 11eee27d811fe5df177e30ba696014aa4f4e0a0d /lab1asm.py | |
| download | tsea83-2ea7eec53978ff743e73b83c4adab942914b0438.tar.gz | |
initial commit
Diffstat (limited to 'lab1asm.py')
| -rw-r--r-- | lab1asm.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/lab1asm.py b/lab1asm.py new file mode 100644 index 0000000..6f09bff --- /dev/null +++ b/lab1asm.py @@ -0,0 +1,79 @@ +import sys + +OPS = { + "load": 0, + "store": 1, + "add": 2, + "sub": 3, + "and": 4, + "lsr": 5, + "bra": 6, + "bne": 7, + "halt": 8, + "cmp": 9, + "bge": 10, + "beq": 11, +} + +def compile(lines): + addr = 0 + labels = {} + compiled = [] + for line in lines: + if not line: + # empty line, ignore + continue + if line.startswith(";"): + # comment + continue + if line.endswith(":"): + # label + labels[line.split(":")[0]] = addr + continue + match line.split(" "): + case [inst, gr, m, *adr]: + if int(m) == 1: + assert adr == [] + compiled.append("{:02x}: {:01x}{:01x}{:02x}".format( + addr, + OPS[inst], + int(gr) * 4 + int(m), + int(adr[0], 16) if int(m) != 1 else 0, + )) + case [inst, label]: + assert inst in ("bra", "bne", "bge", "beq") + compiled.append("{:02x}: {:01x}000".format( + addr, + OPS[inst], + )) + addr += 1 + compiled.append("{:02x}: <{}>".format( + addr, + label + )) + case ["halt"]: + compiled.append("{:02x}: {:01x}000".format(addr, OPS["halt"])) + case [oper]: + compiled.append("{:02x}: {:04x}".format(addr, int(oper, 16))) + case _: + compiled.append(" !!!", line) + continue + addr += 1 + + linked = [] + for line_nr, line in enumerate(compiled): + for label, label_nr in labels.items(): + line = line.replace(f"<{label}>", f"{label_nr - line_nr:04x}") + linked.append(line) + + return linked, labels + + +if __name__ == "__main__": + prog, labels = compile([line.strip() for line in sys.stdin]) + print("prog:") + print("\n".join(prog)) + print() + print("labels:") + for label, label_nr in labels.items(): + print(label, hex(label_nr)) |
