summaryrefslogtreecommitdiffstats
path: root/lab1asm.py
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2022-01-26 21:36:44 +0100
committerGustav Sörnäs <gustav@sornas.net>2022-01-26 21:36:44 +0100
commit2ea7eec53978ff743e73b83c4adab942914b0438 (patch)
tree11eee27d811fe5df177e30ba696014aa4f4e0a0d /lab1asm.py
downloadtsea83-2ea7eec53978ff743e73b83c4adab942914b0438.tar.gz
initial commit
Diffstat (limited to 'lab1asm.py')
-rw-r--r--lab1asm.py79
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))