查看文章 |
ZZ机(请选手一定要仔细读题目以免产生误解) 程序名:zz.* 时间限制:2秒 输入:zz.in 内存限制: 输出:zz.out 问题背景: ZZ作为上海交通大学计算机系的学生,免不了要修《计算机科学导论》这门课,以便对本学科产生一种概貌性的认识。在某堂有关机器语言的课上,老师提到了ZZ机(ZZ:怎么和我同名??)这个概念。她称:众所周知,计算机的功能是极其强大的,也许我们会认为这些功能的实现是由于它内部复杂的电路设计。但是事实上,一台裸机(没有任何软件支持的机器)提供给我们的功能是十分简单的,它的电路设计也只是一些简单模块的组合,但数量极大。像我们的这台ZZ机只提供了12条基本指令,但就是利用如此简单的指令集也同样可以实现非常复杂的功能。 下面介绍一下ZZ机的结构: 我们的ZZ机包括一个CPU(Central Processing Unit)和一个主存储器(Main Memory)。CPU与主存储器之间用一条总线(Bus)相连。 ZZ机的主存很小,只有256个单元(Cell),每个单元用00到FF的十六进制整数标识地址(机器内表示为0000 0000到1111 1111)。每个单元能够存储一个字节的信息(即十六进制数00到FF)。 ZZ机的CPU中包含一个运算/逻辑单元ALU(Arithmetic/Logic Unit)和一个控制单元(Control Unit)。其中的ALU提供给我们5种基本运算(指令集中5到9)。而控制单元中包含一个寄存器组(Register Group),一个程序指针(Program Counter)以及一个指令寄存器(Instruction Register)。其中寄存器组包括16个多用途的寄存器从0到F编号(每个寄存器用一位十六进制数标识,机器内表示为0000到1111)。每个寄存器的可以存储一个字节的信息。程序指针包含一个字节,用于记录主存单元的地址从00到FF。指令寄存器包含2个字节,记录一条正在被执行的指令。(ZZ机的一条完整指令用2个字节表示) 再来介绍一下我们ZZ机的程序执行过程(Program Execution): 控制器完成一项工作要重复进行一个三歩过程即所谓一个指令周期(Machine Cycle)。 1.提取 在主存中获取一条指令(地址由程序指针给出)并存储在指令寄存器中,然后使程序指针的值增加2,指向下一条指令,如果程序指针的值超过FF则对256取模。 2.解码 对存储在指令寄存器中的指令进行解码。如果指令错误(如出现指令不在所给的指令集内等情况),则程序非法结束。 3.执行 执行指令寄存器中的指令。如果程序没有结束,则返回第一步。 ZZ机的输出设备 ZZ机的输出设备是一台穿孔纸带机(设备编号为1)。纸带机可在纸带上打孔(有孔处代表1,无孔处代表0),代表输出的数值的二进制编码。 最后介绍ZZ机的指令集: 每条指令由两个主存单元的内容即一个四位16进制数构成,分成两个部分,第一部分表示表示要执行的操作(一位16进制数),其余3位为被操作的对象。 下表列出了ZZ机的指令集
注意:1.加法溢出情况的处理,如FF+01=00。 2.若指令中0的位置(如指令C000中有3个0位置)出现其他的数,不影响指令的执行。 末了,老师道:到此为止,相信大家应该对我们的这台ZZ机已经有所了解。然而到底这台ZZ机能够发挥多大的作用,还要靠程序员的天才。 你们的任务就是,给出程序员顺序存入ZZ机主存的K段程序(每段程序运行之前所有寄存器清0,一段程序执行结束后再输入下一段程序),输出当所有程序段都执行完毕后,哪几段程序输出到纸带上的结果是相同的。由于纸带长度很有限,所以程序员规定给每段程序输出的长度为2个字节(固定),若输出不足2个字节则后面用0补足(纸带未被打孔使用),若输出超过2个字节或没有输出则视为输出错误。 输入说明: 每个测试数据的第一行包含1个正整数K(K≤500),表示有K个程序,每个程序包含257行,前256行每行两位16进制数(中间无空格,用大写字母A到F表示超过9的部分),表示每个主存单元的内容(00到FF),第257行表示程序指针的内容。 输出说明: 第一行输出一个正整数M,表示把K个程序分成M个类(ERROR类也计算在内),每个类中的程序输出到纸带的结果相同。 下面M行,每行输出一个类的全部元素(空格分隔)。输出完毕后空6个空格后输出“OUTPUT:”然后输出纸带上的结果。 注意: 1. 类的输出顺序按每个类中元素的个数从大到小排列,若元素个数相同的类有多个,则按照每个类的首元素的编号从小到大输出。 2. 类中元素(程序编号)的输出顺序按编号从小到大输出。 3. 若程序输出超过2个字节或无输出则视为输出错误,归为同一个类OUTPUT ERROR,先输出一行“OUTPUT ERROR:”再输出一行所有程序名,若没有这样的程序则不输出OUTPUT ERROR,且位于PROGRAM ERROR类之前。 4. 每个能够正常结束的程序都在100000个指令周期内结束。若程序无法正常结束,则要强制退出,且把这类程序与指令错误的程序归为同一个类PROGRAM ERROR,先输出一行“PROGRAM ERROR”再输出一行所有程序名,若没有这样的程序则不输出PROGRAM ERROR。 5. 如果一个程序同时出现OUTPUT ERROR和PROGRAM ERROR两种错误则只记录在PROGRAM ERROR中。 |