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