你不是一个 Mi 语人,看腻了 Mi 语 的你决定写点 Python
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 是一个寄存器名cal <Label>:跳转到 <Label>: 处,并可通过 ret 返回到最后一次 cal 处
ret:返回到最后一次 cal 处
#...:注释,以 # 开头的行与空行不会被解释器读取
邪恶的包晨文女王说 “你来写吧” ,让杭州第一名媛傅语萱写了一个 Mi 语 ,然后用信息老师惯用的算法 优化 了一下然后就RE了
她说如果你能够帮她改成 Python,“我就嫁给你”。
# 2311315 对以上文字(除 让 ~ 写 间的部分)表示强烈谴责但碍于第五时代的终结而不便篡改史料
要求:阅读以下 Mi 语 ,并实现一个功能上一模一样(算法无所谓)的程序
程序注:输入即为r8
mov r8 3232323
mov r5 r8
mov r1 r8
mov r2 r1
div r1 2
mul r1 2
sub r2 r1
equ r2 0
jic No
mov r7 0
Loop:
mov r3 r8
mov r4 r3
div r4 10
mul r4 10
sub r3 r4
mul r7 10
add r7 r3
div r8 10
bth r8 0
jic Loop
equ r7 r5
jic Yes
jmp No
Yes:
mov r9 1
jmp end
No:
mov r9 0
jmp end
end:
out r9
mov rs 1