你是一个
Mi 语人,写腻了 Python 的你决定写点
Mi 语
Mi 语与汇编相似,直接操作寄存器,有 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, rp, ri, rj, rc, rr, rs 共 16 个寄存器
字母寄存器有一些特殊含义:
rp: 指令指针 ri, rj: 通常用作循环变量 rc: 进行比较时的结果存储寄存器 rr: 通常用于存储返回值 rs: 为 1 时结束程序
Mi 语的基本语法是:
mov <arg1> <arg2>:将 arg2 的值 赋值给 arg1,其中 arg1 是一个寄存器名,arg2 是一个寄存器名或整数
out <arg1>:打印 arg1 的值,其中 arg1 是一个寄存器名或整数
add <arg1> <arg2>:将 arg1 + arg2 的值 赋值给 arg1,其中 arg1 是一个寄存器名,arg2 是一个寄存器名或整数
sub <arg1> <arg2>:将 arg1 - arg2 的值 赋值给 arg1,其中 arg1 是一个寄存器名,arg2 是一个寄存器名或整数
mul <arg1> <arg2>:将 arg1 * arg2 的值 赋值给 arg1,其中 arg1 是一个寄存器名,arg2 是一个寄存器名或整数
div <arg1> <arg2>:将 arg1 // arg2 的值 赋值给 arg1,其中 arg1 是一个寄存器名,arg2 是一个寄存器名或整数
<Label>: :位置标识符,供 jmp 进行跳转
jmp <Label>:跳转到 <Label>: 处
jic <Label>:如果 rc 为 1 则跳转到 <Label>: 处
bth <arg1> <arg2>:将 arg1 > arg2 的值 赋值给 rc,其中 arg1 是一个寄存器名,arg2 是一个寄存器名或整数
sth <arg1> <arg2>:将 arg1 < arg2 的值 赋值给 rc,其中 arg1 是一个寄存器名,arg2 是一个寄存器名或整数
equ <arg1> <arg2>:将 arg1 == arg2 的值 赋值给 rc,其中 arg1 是一个寄存器名,arg2 是一个寄存器名或整数
rev <arg1>:将 not arg1 的值 赋值给 rc,其中 arg1 是一个寄存器名
< 以上同
1336 >
cal <Label>:跳转到 <Label>: 处,并可通过 ret 返回到最后一次 cal 处
ret:返回到最后一次 cal 处
请实现一个
Mi 语解释器, 要求在
1336 的基础上实现 cal, ret 指令