• 2016CCF-CCSP竞赛:第1题-虚拟机设计(共3题)


    2016CCF-CCSP竞赛:第1题-虚拟机设计(共3题)


    题目概览:

    • 定义一种类似于汇编的语言X,只有8种基本指令。
    • Part1:用高级语言编写虚拟机,模拟运行X语言代码。(105分)
    • Part2:编写X语言代码,在虚拟机上完成三个简单的任务。(45分)


    Part1:

    • 内存
        16位虚拟机,内存地址从0000到FFFF。
        规定其中[3000,B000)是数据段,可以读写。
        小端存储
    • 寄存器
        四个16位寄存器AX,BX,CX,DX
    • 数据
        所处理的数据均为16位无符号整数


    Part1 - 操作数:

    • 立即数
        16位无符号整数,在指令中以4位十六进制数的形式出现。
    • 寄存器
        AX,BX,CX,DX
    • 内存
        立即数直接寻址:T0C20
        寄存器间接寻址: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 
        本题只涉及加法,未考察减法操作,故单独设立一个CMP指令,比较操作数A和B中的值的大小关系,仅用做条件跳转的依据。
    • 无条件跳转 JMP X
    • 条件跳转  J?? X
        JL,JG,JE,JNL,JNG,JNE
    • 操作数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改版)

  • 相关阅读:
    Java 书籍 Top 10
    maven学习笔记
    Extjs study
    初学spring mvc
    spring context:componentscan (转)
    What is AspectJ(转)
    java concurrency 学习
    (转)深入浅出REST
    icloud不用翻就能显示地图的办法(转)
    OSGi知识
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564123.html
Copyright © 2020-2023  润新知