你不是一个
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 语 ,然后用信息老师惯用的算法
优化 了一下
然后就超时了
她说如果你能够帮她改成 Python,“我就嫁给你”。(
23542923)
要求:阅读以下
Mi 语 ,并实现一个功能上一模一样(算法无所谓)的 程序
注:输入即为 r8
mov r8 2211247
Loop:
bth r8 0
rev rc
jic End
mov ri r8
div ri 2
mul ri 2
mov r3 r8
sub r3 ri
mul r4 2
add r4 r3
div r8 2
jmp Loop
End:
out r4
mov rs 1