2016CCF-CCSP竞赛:第1题-虚拟机设计(共3题)
题目概览:
- 定义一种类似于汇编的语言X,只有8种基本指令。
- Part1:用高级语言编写虚拟机,模拟运行X语言代码。(105分)
- Part2:编写X语言代码,在虚拟机上完成三个简单的任务。(45分)
Part1:
- 内存
规定其中[3000,B000)是数据段,可以读写。
小端存储
- 寄存器
- 数据
Part1 - 操作数:
- 立即数
- 寄存器
- 内存
寄存器间接寻址:TAX
Part1 - 八种指令:
- RUN 标识程序的开始
- STOP 标识程序正常结束
- ECHO A 将操作数A中的值输出
- ADD A B A+=B,溢出直接忽略,A不能是立即数
- INC A A+=1,溢出直接忽略,A不能是立即数
- MOV A B A=B,A不能是立即数
- CMP和JMP类指令
Part1 - 跳转类指令:
- CMP A B
- 无条件跳转 JMP X
- 条件跳转 J?? X
- 操作数X中的值为跳转目的指令的行号
Part1 - 指令格式要求:
- 每行一条指令,指令内部不同部分之间仅用一个空格进行分隔,不允许有多余空格。
- 第一行指令是RUN,最后一行指令是STOP,程序中不允许有其它的RUN和STOP。
- 指令中所有的字母均为大写。
- 出于对时钟周期的考量,一条指令中不能同时存在两个内存操作数。
Part1 - 异常情况:
- 虽然Part1给出的程序均满足格式要求,但运行时仍会遇到以下四种异常情况。
- 存取非法 只能读写数据段
- 耗时过长 最多执行100万条次指令
- 跳转错误 只能跳转到2~N行
- CMP缺失 条件跳转前没有CMP
Part1 - 异常情况:
- 耗时过长是在指令执行结束后判断
- 同一条指令执行时可能涉及多种错误
条件跳转 JG T0000
- 根据内在逻辑关系,定义优先级如下:
CMP缺失 > 存取非法 > 跳转错误
Part1:
- 输入
8种指令编写的一段程序,不超过100行。
- 输出
每个顺利执行的ECHO语句输出一行,4位十六进制整数,字母大写。
如果程序异常退出,再输出一行提示信息
存取非法:ACCESS_VIOLATION
耗时过长:TLE
跳转错误:RUNTIME_ERROR
CMP缺失:CMP_MISSING
Part1 - 测试用例:
- 总共15组测试用例,105分平均分配。
- 1~5组数据:不涉及内存操作,不涉及跳转操作。
- 6~10组数据:涉及内存操作,不涉及跳转操作。
- 11~15组数据:两种操作均有。
Part1 - 测试用例:
- 1~5:均能正常结束。
- 6~10:全部会触发ACCESS_VIOLATION,其中9、10涉及访问AFFF。
- 11:CMP缺失
- 12、13:耗时过长
- 14:跳转错误
- 15:正常结束
Part2:
- 用这8种指令编写程序,在虚拟机上完成三个子任务。
- Special Judge:
代码40行以内
无格式错误
STOP正常结束
结果正确
- 无需读入数据,已经内置于内存和寄存器中
- 通过ECHO指令将答案输出
- 所有的数据默认为16位无符号整数
Part2:
- Sample Task
已知A和B,输出A和B的较小值
- TaskA
输出A1……AN的最大值
- TaskB
输出A1……AN的不同的值的个数,<=5*10^3
- TaskC
输出组合数C(N,M)%65536的结果,<=2*10^2
(本文根据官方提供的PPT改版)