Skip to content

Instantly share code, notes, and snippets.

@ty-porter
Created August 27, 2021 03:16
Show Gist options
  • Save ty-porter/aa85dbf337dc0097a2e3ae54671509a6 to your computer and use it in GitHub Desktop.
Save ty-porter/aa85dbf337dc0097a2e3ae54671509a6 to your computer and use it in GitHub Desktop.
A toy assembler written in Python
class Assembler:
def __init__(self, program):
self.program = program
self.registers = {}
self.program_counter = 0
def run(self):
while self.program_counter < len(self.program):
fn_name, *args = self.program[self.program_counter].split(" ")
fn = getattr(self, fn_name)
fn(*args)
def increment_program_counter(fn):
def wrapper(self, *args):
fn(self, *args)
self.program_counter += 1
return wrapper
@increment_program_counter
def mov(self, register, value):
self.registers[register] = self.register_to_value(value)
@increment_program_counter
def inc(self, register):
self.registers[register] += 1
@increment_program_counter
def dec(self, register):
self.registers[register] -= 1
def jnz(self, test_value, inc_value):
test_value = self.register_to_value(test_value)
inc_value = self.register_to_value(inc_value)
if test_value != 0:
self.program_counter += inc_value
else:
self.program_counter += 1
def register_to_value(self, value):
if self.is_integer(value):
value = int(value)
else:
value = self.registers[value]
return value
def is_integer(self, n):
try:
float(n)
except ValueError:
return False
else:
return float(n).is_integer()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment