diff --git a/infernal.py b/infernal.py index 2255d23..a41cfd9 100644 --- a/infernal.py +++ b/infernal.py @@ -2,7 +2,8 @@ import re import sys -REGISTERS=["%rip","%rbp","%rsp","","%rax","%rdi","%r8","%r9"] +REGISTERS=["%rax", "%rbx", "%rcx", "%rdx", "%rsp", "%rbp", "%rsi", "%rdi", + "%r8," "%r9," "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"] REG_STATUS_TO_COLOR = { "insert": "green", "change": "yellow", @@ -191,6 +192,7 @@ class Emulator: elif opcode[:3] == "cmp": self.compareVal(instruct[1],instruct[2]) + elif opcode == "jg": if self.status["g"]: self.registers['%rip'] = self.labels[instruct[1]] diff --git a/tests/test_fib.py b/tests/test_fib.py index 041588e..b5c97d7 100644 --- a/tests/test_fib.py +++ b/tests/test_fib.py @@ -60,7 +60,8 @@ if __name__ == "__main__": printf("Running for fib({})", a) # Setup - emu = infernal.Emulator(fib_prog) #infernal.Emulator(fib_iter_prog) + registers = ["%rip","%rbp","%rsp","","%rax","%rdi","%r8","%r9"] + emu = infernal.Emulator(fib_prog, registers) painter = infernal.TikzPainter() emu.setStack("junk...", "calling eip") emu.setRegs( rip = 0, rbp = 'old bp', rdi = a ) diff --git a/tests/tests.py b/tests/tests.py new file mode 100644 index 0000000..3603d64 --- /dev/null +++ b/tests/tests.py @@ -0,0 +1,67 @@ +import os,sys,inspect +sys.path.insert(1, os.path.join(sys.path[0], '..')) +import infernal + +################################################################################ + +tests = [] + +def add_test(name, result, register, code): + tests.append((name, result, register, code)) + +def execute_test (register, code): + emu = infernal.Emulator(code) + emu.setStack("junk...", "calling eip") + emu.setRegs( rip = 0, rbp = 'old bp') + + for line_nr in emu: + pass + + return emu.getVal(register) + +def printf (str, *args): + print(str.format(*args)) + +def execute_tests(): + print("Executing tests!") + total_tests = 0 + failed_tests = 0 + error_tests = 0 + for name, result, register, code in tests: + total_tests += 1 + try: + output = execute_test(register, code) + if output != result: + failed_tests += 1 + printf("Failed in {}. {} was {}, should be {}", + name, register, result, output) + except BaseException as e: + error_tests += 1 + printf("Encountered error in {}: {}",name,e) + printf("Tests done! {}/{}.", + total_tests - failed_tests - error_tests, total_tests) + printf("{} failed, and {} encountered a python error", + failed_tests, error_tests) + +################################################################################ + +add_test("constant $255", 255, "%rsi", """ +movq $255, %rsi +""") + +add_test("static addition 10+$20", 30, "%rsi", """ +movq $10, %rsi +addq $20, %rsi +""") + +add_test("register addition 10+20", 30, "%rsi", """ +movq $10, %rsi +movq $20, %rax +addq %rax, %rsi +""") + + +################################################################################ + +if __name__ == "__main__": + execute_tests()