百度空间 | 百度首页 
 
查看文章
 
ZZ机
2006-11-05 10:55

ZZ

(请选手一定要仔细读题目以免产生误解)

程序名:zz.*                                                                                        时间限制:2

输入:zz.in                                                                                           内存限制:64M

输出:zz.out

 

问题背景:

ZZ作为上海交通大学计算机系的学生,免不了要修《计算机科学导论》这门课,以便对本学科产生一种概貌性的认识。在某堂有关机器语言的课上,老师提到了ZZ机(ZZ:怎么和我同名??)这个概念。她称:众所周知,计算机的功能是极其强大的,也许我们会认为这些功能的实现是由于它内部复杂的电路设计。但是事实上,一台裸机(没有任何软件支持的机器)提供给我们的功能是十分简单的,它的电路设计也只是一些简单模块的组合,但数量极大。像我们的这台ZZ机只提供了12条基本指令,但就是利用如此简单的指令集也同样可以实现非常复杂的功能。

 

下面介绍一下ZZ机的结构:

我们的ZZ机包括一个CPUCentral Processing Unit)和一个主存储器(Main Memory)。CPU与主存储器之间用一条总线(Bus)相连。

ZZ机的主存很小,只有256个单元(Cell),每个单元用00FF的十六进制整数标识地址(机器内表示为0000 00001111 1111)。每个单元能够存储一个字节的信息(即十六进制数00FF)。

ZZ机的CPU中包含一个运算/逻辑单元ALUArithmetic/Logic Unit)和一个控制单元(Control Unit)。其中的ALU提供给我们5种基本运算(指令集中59)。而控制单元中包含一个寄存器组(Register Group),一个程序指针(Program Counter)以及一个指令寄存器(Instruction Register)。其中寄存器组包括16个多用途的寄存器从0F编号(每个寄存器用一位十六进制数标识,机器内表示为00001111)。每个寄存器的可以存储一个字节的信息。程序指针包含一个字节,用于记录主存单元的地址从00FF。指令寄存器包含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

RXY

把主存地址XY的内容放到寄存器R

2

RXY

把数据XY存入寄存器R

3

RXY

把寄存器R的内容写入主存XY

4

0RS

把寄存器R的内容复制到寄存器S

5

RST

把寄存器S的内容和寄存器T的内容作为整型数相加,并把值放在寄存器R

6

RST

把寄存器S的内容和寄存器T的内容取或,并把值放在寄存器R

7

RST

把寄存器S的内容和寄存器T的内容取与,并把值放在寄存器R

8

RST

把寄存器S的内容和寄存器T的内容取异或,并把值放在寄存器R

9

R0X

将寄存器R的内容向右循环移位X

A

RXY

如果寄存器R的内容等于寄存器0,则程序指针指向地址XY(不再增加2)并执行接下去的语句

B

RXY

把主存中地址为XY的单元的内容输出到设备R(无论输出到什么设备都不会出错)

C

000

程序终止

注意:1.加法溢出情况的处理,如FF+01=00

2.若指令中0的位置(如指令C000中有30位置)出现其他的数,不影响指令的执行。

末了,老师道:到此为止,相信大家应该对我们的这台ZZ机已经有所了解。然而到底这台ZZ机能够发挥多大的作用,还要靠程序员的天才。

你们的任务就是,给出程序员顺序存入ZZ机主存的K段程序(每段程序运行之前所有寄存器清0,一段程序执行结束后再输入下一段程序),输出当所有程序段都执行完毕后,哪几段程序输出到纸带上的结果是相同的。由于纸带长度很有限,所以程序员规定给每段程序输出的长度为2个字节(固定),若输出不足2个字节则后面用0补足(纸带未被打孔使用),若输出超过2个字节或没有输出则视为输出错误。

输入说明:

每个测试数据的第一行包含1个正整数KK500),表示有K个程序,每个程序包含257行,256行每行两位16进制数(中间无空格,用大写字母AF表示超过9的部分),表示每个主存单元的内容(00FF),第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 ERRORPROGRAM ERROR两种错误则只记录在PROGRAM ERROR中。


类别:默认分类 | 添加到搜藏 | 浏览() | 评论 (8)
 
最近读者:
 
网友评论:
1
2006-11-05 15:03 | 回复
本题为什么没有测试数据?
 
2
2006-11-05 15:04 | 回复
to candy:ZZ机测试数据见http://hi.baidu.com/noipsc2006/blog/item/c9996fd9329d49e939012f87.html 或http://www.oibh.org/bbs/attachment.php?aid=9112
 
3
2006-11-05 16:34 | 回复
NOIp不会出那么长的题目的吧...郁闷...
 
4
2006-11-05 16:37 | 回复
这很正常啊,题目就是给你叙述一个背景,然后才给你问题的.... 要有耐心啊:)
 
5
2006-11-05 16:53 | 回复
什么时候发布测试数据,解题报告及标程
 
6
2006-11-05 16:53 | 回复
本人见过的最大模拟牛题.........
 
7
2006-11-05 16:55 | 回复
我们的作业就是这种题目,ft死了 数据应该晚上就会发布的..
 
8
2006-11-05 17:18 | 回复
@li :数据、报告、标程 今天晚上8点之前发
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu