【自主出题】Mini-Machine & The Loop

题目 Mini-Machine & The Loop

题目背景

1936年,艾伦·图灵提出了图灵机的理论模型。一台图灵机由一条无限长的纸带、一个能够读写符号并改变状态的控制器组成。尽管结构如此简单,它却能够执行任何机械可计算的过程,为现代计算机科学奠定了基础。今天的计算机虽然复杂得多,其核心依然遵循着冯·诺依曼体系结构:存储程序,顺序执行

题目描述

小明设计了一台迷你虚拟机,该机器包含 4 个 64 位有符号整数寄存器,名称分别为 r0, r1, r2, r3
虚拟机能够执行一个由若干指令组成的程序。初始时所有寄存器的值均为 0,程序从第 1 行开始顺序执行,直到遇到 HLT 指令时停机。

虚拟机支持的指令集如下(每行一条指令,操作数之间用单个空格分隔):

指令格式 含义
MOV dst, src 将源操作数 src 的值复制到目标寄存器 dstdst 必须是寄存器名;src 可以是寄存器名或整数常量(如 123-5)。
ADD dst, src dst = dst + srcsrc 可以是寄存器名或整数常量。
SUB dst, src dst = dst - srcsrc 可以是寄存器名或整数常量。
JMP offset 无条件跳转到“当前行号 + offset”的位置。offset 是一个整数。行号从 1 开始计数。
JNZ reg, offset 若寄存器 reg 的当前值 不为 0,则跳转到“当前行号 + offset”;否则顺序执行下一条。
HLT 停机,虚拟机立即退出。

程序结构保证

  • 程序有且仅有一条跳转指令,是一条 JNZ,且它的 offset 为负数(即往回跳),从而形成一个唯一的循环
  • 这个 JNZ 所在的循环体内部没有任何其它跳转指令。也就是说,循环体由若干条纯算术指令(MOVADDSUB)组成,最后紧跟着一条 JNZ
  • 循环之前可能有一段顺序执行的“前缀”指令(也可以为空);在 JNZ 之后只有一条 HLT 指令,后面没有任何指令。
  • 程序保证会最终停机(循环一定会终止)。
  • 所有寄存器值、常数以及中间结果均在 $[-10^{18},10^{18}]$ 范围内,最终答案也保证在此范围内。

现在,给你一段符合上述约束的程序,请你输出虚拟机停机时 r0, r1, r2, r3 的值。

输入格式

第一行一个整数 M,表示指令的总行数。
接下来 M 行,每行一条指令,格式如上所述。行首行尾没有多余空格,操作数之间用单个空格隔开。

输出格式

一行四个整数,依次为寄存器 r0, r1, r2, r3 的值,之间用空格分隔。

样例输入 1

1
2
3
4
5
6
7
6
MOV r0, 5
MOV r1, 0
ADD r1, r0
SUB r0, 1
JNZ r0, -2
HLT

样例输出 1

1
0 15 0 0

解释
前缀指令将 r0 置为 5,r1 置为 0。
循环体为第 3~5 行:

  • ADD r1, r0r1 += r0
  • SUB r0, 1r0 -= 1
  • JNZ r0, -2 → 若 r0 != 0 则跳回第 3 行

该循环执行 5 次:r1 依次累加 5, 4, 3, 2, 1,总和为 15;r0 最终变为 0,退出循环,执行 HLT

样例输入 2

1
2
3
4
5
6
7
5
MOV r0, 1000000000
MOV r1, 0
ADD r1, 3
SUB r0, 1
JNZ r0, -2
HLT

样例输出 2

1
0 3000000000 0 0

数据范围与提示

  • 对于 30% 的测试数据,循环实际执行次数 ≤ 1000。
  • 对于 100% 的测试数据,1 ≤ M ≤ 2000,循环执行次数可能高达 $10^{12}$。所有数值在 64 位有符号整数范围内。