-->
当前位置:首页 > 题库

编程题:机器时代(machine_era)

Luz4年前 (2022-05-25)题库722
让我们重温机器语言的美好时代!

任务:实现简化版图灵机,执行一段机器语言程序。
目的:了解图灵机模型;为计算机组成、体系结构、汇编语言、可计算性做先导。

我们的虚拟机是**哈佛架构**:指令与数据位于不同的内存空间。

- 指令最多64KiB。
- 数据内存固定64KiB,单元是字节,可保存0到255的数值。

虚拟机有2个寄存器:

- 程序指针**PC**:保存**当前指令**在指令内存中的地址。16位无符号数。**每执行完一条指令,自动+1。**
- 数据指针**PD**:保存**当前数据**在数据内存中的地址。16位无符号数。

虚拟机有8种指令:

- 0: **输出**当前单元字符。
- 1: **输入**字符并保存到当前单元。
- 2: 当前单元数值+1。
- 3: 当前单元数值-1。
- 4: 数据指针移到下一个单元(地址+1)。
- 5: 数据指针移到上一个单元(地址-1)。
- 6:如果当前单元值等于0,PC前向(地址增大)跳转到指令7。
- 7:如果当前单元值不为0,PC后向(地址减小)跳转到指令6。

**每执行完一条指令PC自动加1,所以指令6、7跳转后将从目标的下一条指令继续运行。**

输入规格:

- 首行是本题描述的机器语言指令,请整行读入、逐字符执行。
- 数据输入时请用cin.get(x)逐字符读入。
- 为简化处理,指令是'0'到'7'的字符,而不是数值。
- 后续为输入数据。

输出规格:

- 执行到输出指令时,用cout.put(c)输出当前数据单元对应的字符。

样例输入1:

in
1414105050
ABC


样例输出1:

out
CBA


样例说明1:

- 首行共10条指令,依次执行:
- 指令1:读入字符A到数据单元[0]。
- 指令4:数据指针递增,指向[1]。
- 指令1:读入字符B到数据单元[1]。
- 指令4:数据指针递增,指向[2]。
- 指令1:读入字符C到数据单元[2]。
- 指令0:输出数据单元[2]的内容(字符C)。
- 指令5:数据指针递减,指向[1]。
- 指令0:输出数据单元[1]的内容(字符B)。
- 指令5:数据指针递减,指向[0]。
- 指令0:输出数据单元[0]的内容(字符A)。

样例输入2:

in
1416502437
!^


样例输出2:

out
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~


样例说明2:

- 首行共10条指令,依次执行:
- 1:读入字符!到数据单元[0]
- 4:数据指针递增,指向单元[1]
- 1:读入字符^到数据单元[1]。作为计数变量使用
- 6:如果[1]单元值等于0则跳转到指令7。而字符^编码是94,不跳转。
- 5:数据指针递减,指向单元[0]
- 0:输出单元[0]对应字符!
- 2:单元[0]值+1,对应ASCII下一字符。
- 4:数据指针递增,指向单元[1]
- 3:单元[1]值-1
- 7:如单元[1]值不为0,反向跳转到指令6。否则结束。
- 指令6~7会循环94次,直到单元[1]的值减为0,即输出从!到~的字符。





答案:若无答案欢迎评论