编程题:机器时代(machine_era)
让我们重温机器语言的美好时代!
任务:实现简化版图灵机,执行一段机器语言程序。
目的:了解图灵机模型;为计算机组成、体系结构、汇编语言、可计算性做先导。
我们的虚拟机是**哈佛架构**:指令与数据位于不同的内存空间。
- 指令最多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,即输出从!到~的字符。
答案:若无答案欢迎评论
任务:实现简化版图灵机,执行一段机器语言程序。
目的:了解图灵机模型;为计算机组成、体系结构、汇编语言、可计算性做先导。
我们的虚拟机是**哈佛架构**:指令与数据位于不同的内存空间。
- 指令最多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,即输出从!到~的字符。
答案:若无答案欢迎评论