UVA448 OOPS!
题目描述
# 我的代码——
## 题目背景
你在敲代码,但你的 好 朋 友 不小心把你的代码删掉了。幸运的是,你还有上一次编译得到的可执行程序和一份上课记下的反汇编手册。请你通过反汇编救回你的代码。
手册如下:
| 十六进制表示 | 操作描述 | 参数数量 ($n$)
| ----------- | ----------- | ----------- |
| $0$ |$\bold{ADD}\ [R,A,N],[R,A]$ | $2$
| $1$ |$\bold{SUB}\ [R,A,N],[R,A]$ | $2$
| $2$ |$\bold{MUL}\ [R,A,N],[R,A]$ | $2$
| $3$ |$\bold{DIV}\ [R,A,N],[R,A]$ | $2$
| $4$ |$\bold{MOV}\ [R,A,N],[R,A]$ | $2$
| $5$ |$\bold{BREQ}\ A$ |$1$
| $6$ |$\bold{BRLE}\ A$ |$1$
| $7$ |$\bold{BRLS}\ A$ |$1$
| $8$ |$\bold{BRGE}\ A$ |$1$
| $9$ |$\bold{BRGR}\ A$ |$1$
| $A$ |$\bold{BRNE}\ A$ |$1$
| $B$ |$\bold{BR}\ A$ |$1$
| $C$ |$\bold{AND}\ [R,A,N],[R,A,N],[R,A]$ | $3$
| $D$ |$\bold{OR}\ [R,A,N],[R,A,N],[R,A]$ | $3$
| $E$ |$\bold{XOR}\ [R,A,N],[R,A,N],[R,A]$ | $3$
| $F$ |$\bold{NOT}\ [R,A]$ | $1$
其中,$R$ 表示寄存器(Register),$A$ 表示地址(Address),$N$ 表示常量(Number)。
如: $\bold{ADD}\ [R,A,N],[R,A]$ 表示 $\bold{ADD}$ 操作需要两个参数,前一个参数类型为 $R,A$ 或 $N$,后一个参数类型为 $R$ 或 $A$。
每个操作占1个**十六进制**数字,每个参数是一个**十六进制**的四位数,可转化为16个**二进制**位(bit)。前2个**二进制**位表示该参数的类型(mode),后14个**二进制**位表示该参数的值(value)。
| 二进制位 | 类型 | 值的范围(十进制)
| :----------- | :----------- | -----------
| $00$ | 寄存器 | $[0,1023]$
| $01$ | 绝对地址 | $[0,16383]$
| $10$ | 相对地址 | $[0,16363]^*$
| $11$ | 常量 |$[0,16383]$
解释(V表示该参数的值,十进制表示):
寄存器类型($mode=00$)以`RV`格式输出。如:值为 `7` 时,该参数输出为 `R7` 。
绝对地址($mode=01$)以`$V`格式输出。如:值为 `110` 时,该参数输出为 `$110` 。
相对地址($mode=10$)以`PC+V`格式输出。如:值为 `45` 时,该参数输出为 `PC+45` 。
常量类型($mode=11$)以`V`格式输出。如:值为 `1276` 时,该参数输出为 `1276` 。
现在给出可执行程序的十六进制表示,请输出源代码。
输入格式
一个字符串,每30位换行。
该字符串包含所有操作,每个操作先由一个**十六进制**数字表示操作类型,再由 $n$ 个**十六进制**四位数依次表示该操作需要的 $n$ 个参数。
该字符串不含空格。
输出格式
每个操作占一行,先输出操作类型,然后依次输出该操作的参数。操作类型与参数之间有一个空格,参数与参数间有逗号间隔。
## 输入输出样例
#### 输入#1
```
4C00D00004C0020001000000001400
005FFFB801E
```
#### 输出#1
```
MOV 13,R0
MOV 2,R1
ADD R0,R1
MOV R0,$8191
BR PC+30
```
说明/提示
### 【解释-样例1】
**输入 #1**表示了以下5个操作:
- 4 C00D 0000
- 4 C002 0001
- 0 0000 0001
- 4 0000 5FFF
- B 801E
### 【备注】
$^*$ 原题如此。
Translated by Georiky