实现一个反汇编器,将二进制指令,翻译成汇编指令。汇编指令集如下:
操作符 操作数个数 说明
HALT 0,HALT 终止
IN 0,IN 从标准输入中读入整型值并压栈
OUT 0,OUT 从栈中弹出,从标准输出
ADD 0,ADD 从栈中弹出a,弹出b,计算b+a,并将结果压入栈中
SUB 0,SUB 从栈中弹出a,弹出b,计算b-a,并将结果压入栈中
MUL 0,MUL 从栈中弹出a,弹出b,计算b*a,并将结果压入栈中
DIV 0,DIV 从栈中弹出a,弹出b,计算b/a,并将结果压入栈中
DUP 0,DUP 压入栈顶值的拷贝
LD 0,LD 从栈中弹出地址,并压入改地址里的整数值
ST 0,ST 从栈中弹出值,再弹出地址,并将该值存储到该地址中
LDC 1,LDC value 压入value
JLT 1,JLT loc 弹出value,检测value是否小于0,如果小于,则pc=loc
JLE 1,JLE loc 弹出value,检测value是否小于等于0,如果小于等于,则pc=loc
JGT 1,JGT loc 弹出value,检测value是否大于0,如果大于,则pc=loc
JGE 1,JGE loc 弹出value,检测value是否大于等于0,如果大于等于,则pc=loc
JEQ 1,JEQ loc 弹出value,检测value是否等于0,如果等于,则pc=loc
JNE 1,JNE loc 弹出value,检测value是否不等于0,如果不等于,则pc=loc
JMP 0,JMP 不用弹出value,pc=loc
主程序中输出二进制指令的指令码,输出对应的汇编指令。
例如输入:
17 123
17是JMP指令的指令码(十进制的方式,请看提示),123是操作数。那么经过反编译器运行之后输出:
JMP 123
也可以输出二进制形式指令,例如输入
00000000
那么输出:
HALT