#P1049. Microprocessor Simulation
Microprocessor Simulation
描述
考虑一个具有以下属性的小型微处理器:
每个字为 4 位。
地址为两个字。高位字总是在前面。也就是说,一个双字地址的高位字总是占据内存的较低位置。
内存为 256 个字。
有两个累加器,A 和 B,每个累加器存储一个字。
有九条指令代码。每条指令至少需要一个字来存储指定指令的代码。四条指令有参数,并且需要额外的两个字。
每个 4 位数字的取值范围是 0 到 15(包含),以十进制表示。我们将以十六进制的常见方式来书写这些数字,即 A 表示 10,B 表示 11,依此类推。
这九条指令如下:
代码 | 字数 | 描述 |
0 | 3 | LD:将指定参数处内存的内容加载到累加器 A 中。 |
1 | 3 | ST:将累加器 A 的内容写入由参数指定的内存位置。 |
2 | 1 | SWP:交换累加器 A 和 B 的内容。 |
3 | 1 | ADD:将累加器 A 和 B 的内容相加。和的低位字存储在 A 中,高位字存储在 B 中。 |
4 | 1 | INC:累加器 A 加 1。允许溢出;也就是说,对 F 加 1 得到 0。 |
5 | 1 | DEC:累加器 A 减 1。允许下溢;也就是说,对 0 减 1 得到 F。 |
6 | 3 | BZ:如果累加器 A 为零,则执行由参数指定位置的下一条指令。如果 A 不为零,则忽略该参数,不进行任何操作。 |
7 | 3 | BR:执行由参数指定位置的下一条指令。 |
8 | 1 | STP:停止程序执行。 |
微处理器总是从位置 00 开始执行指令。它按顺序执行指令,直到遇到停止指令。
下面的示例展示了部分程序及其效果。
程序 | 描述 |
01A8 | 将内存位置 1A(十进制 26)的内容加载到累加器 A 中,然后停止。 |
01A512F8 | 将内存位置 1A(十进制 26)的内容加载到累加器 A 中,对其减 1,将结果存储到内存位置 2F,然后停止。 |
输入
输入将由几行恰好 256 个十六进制字符组成。每行是内存的内容,从地址 00 开始,到地址 FF 结束。当地址 00 处出现停止指令(“8”)时,表示输入结束。输入的程序永远不会“超出内存范围”,也就是说,你永远不会执行位于地址 F0 到 FF(包含)之间的指令。
0102011311321128FF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
输出
对于每个内存状态,你应该模拟从地址 00 开始的执行过程。当遇到停止指令时,你应该将内存的内容以单个由 256 个十六进制字符组成的字符串形式输出,后面跟一个换行符。
0102011311321128FF1E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
来源
大纽约 2001