feat(L08): add subroutines and ABI card
This commit is contained in:
Executable
+41
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env python3
|
||||
import sys
|
||||
|
||||
|
||||
def task01():
|
||||
pc = 0x100
|
||||
assert pc + 24 == 0x118 and pc + 4 == 0x104
|
||||
assert ((0x205 - 4) & ~1) == 0x200
|
||||
print("PASS task01 jal_target=00000118 link=00000104 jalr_target=00000200")
|
||||
|
||||
|
||||
def abi_class(index):
|
||||
if index == 0: return "zero"
|
||||
if index == 1: return "ra"
|
||||
if index == 2: return "sp"
|
||||
if 10 <= index <= 17: return "arg"
|
||||
if index in (8, 9) or 18 <= index <= 27: return "saved"
|
||||
if 5 <= index <= 7 or 28 <= index <= 31: return "temp"
|
||||
return "system"
|
||||
|
||||
|
||||
def task02():
|
||||
classes = [abi_class(index) for index in range(32)]
|
||||
assert classes.count("arg") == 8 and classes.count("saved") == 12
|
||||
assert classes.count("temp") == 7 and sum(classes.count(x) for x in ("zero", "ra", "sp", "system")) == 5
|
||||
print("PASS task02 args=8 saved=12 temporaries=7 fixed=5")
|
||||
|
||||
|
||||
def task03():
|
||||
stack = []
|
||||
stack.extend([0x104, 0x204])
|
||||
returns = [stack.pop(), stack.pop()]
|
||||
underflow = not stack
|
||||
assert returns == [0x204, 0x104] and underflow
|
||||
print("PASS task03 returns=00000204,00000104 underflow=1 max_depth=2")
|
||||
|
||||
|
||||
TASKS = {"task01_link_address": task01, "task02_abi_registers": task02, "task03_call_stack": task03}
|
||||
if len(sys.argv) != 2 or sys.argv[1] not in TASKS:
|
||||
raise SystemExit(f"usage: {sys.argv[0]} {'|'.join(TASKS)}")
|
||||
TASKS[sys.argv[1]]()
|
||||
Reference in New Issue
Block a user