Problem1381--实现一个汇编器,将汇编指令解释为二进制

1381: 实现一个汇编器,将汇编指令解释为二进制

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 27  Solved: 3
[Submit] [Status] [Web Board] [Creator:]

Description

实现一个汇编器,将汇编指令解释为二进制。采用的汇编指令集如下:

操作符   操作数个数      说明
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




主函数中输入汇编指令,输出二进制指令 。
输出格式如下:
0       00000000
0表示二进制指令的指令码, 00000000表示对应的二进制形式(字符串)。
如果指令有操作数,那么输出如下:
17      00010001        123     00000000000000000000000001111011

17表示指令码,00010001 指令码对应的二进制形式(字符串)123是操作数, 00000000000000000000000001111011操作数对应的二进制形式。

Sample Input

HALT
IN
OUT
JMP 123

Sample Output

0       00000000
1       00000001
2       00000010
17      00010001        123     00000000000000000000000001111011

HINT

// 枚举类型的二进制指令集
enum BinIns
{
    binHalt, binIn, binOut, binAdd, binSub, binMul, binDiv,
    binDup,
    binLd, binSt, binLdc, binJlt, binJle, binJgt, binJge, binJeq, binJne, binJmp,
    binInvalid
};
// 二进制指令结构体
// 指令码+操作数
struct Instruction
{
    BinIns op;  // 指令码只占一个字节
    int    arg; // 操作数,占四个字节
};
输出二进制指令格式:
        cout << bin[i].op << ' ' << IntToString(bin[i].op, 1)<< ' ' << bin[i].arg<< ' ' << IntToString(bin[i].arg, 4)<< endl



Source/Category

 

[Submit] [Status]