From 0603e19435b4304fabd91f840325a153ce31cae2 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Fri, 12 Apr 2024 13:56:41 +0300 Subject: Finish calli/callr/return, add test code --- atk16_asm/asm_ops.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'atk16_asm/asm_ops.py') diff --git a/atk16_asm/asm_ops.py b/atk16_asm/asm_ops.py index 6a08495..6d2b98a 100644 --- a/atk16_asm/asm_ops.py +++ b/atk16_asm/asm_ops.py @@ -227,7 +227,9 @@ def expand_callr(addr_reg: str) -> ExpandResult: ["lpc", "RG"], *expand_addi("RG", "4", "RG"), *expand_spu("RG"), - ["jpr", addr_reg] + ["jpr", addr_reg], + ["ldr", "SP", "RG"], + *expand_dec("SP"), ] def expand_calli(addr_imm: str) -> ExpandResult: @@ -236,11 +238,19 @@ def expand_calli(addr_imm: str) -> ExpandResult: ["ldi", ret_label, "RG"], *expand_spu("RG"), ["jpi", addr_imm], - ["@label", ret_label] + ["@label", ret_label], + ["ldr", "SP", "RG"], # return leaves SP pointing at return value, read to reg + *expand_dec("SP"), # decrement SP to fix stack ] def expand_return() -> ExpandResult: - return expand_spo("RG") + [["jpr", "RG"]] + return [ + ["str", "RG", "SP"], # store returned value on stack but don't increment SP + *expand_dec("SP"), # decrement SP to access the return address + ["ldr", "SP", "RG"], # load return address to RG + *expand_inc("SP"), # point SP to return value + ["jpr", "RG"] # jump back to call site + ] def stack_stash(*rs: str) -> ExpandResult: result: ExpandResult = [] -- cgit v1.3