mysql封机器码_机器码转汇编指令

在用logisim初步画完CPU电路后,配合educoder调试电路。提交代码到educoder后,后台会检测错误信息,根据报错信息中的周期数或者PC值,可以找到错误的指令机器码。

但是机器码太抽象,因此使用下面的程序将指令机器码翻译成指令名称,进而继续调试电路。

/*

32位MIPS指令翻译器

输入一条16进制的指令

输出该指令的详细信息

*/

#include

#include

#include

#include

#include

using namespace std;

typedef unsigned int IRType;//存储32位指令

struct INST{

string name;

string type;

string func;

};

//24条MIPS指令

map transTable = {//can not be const

{"000000000000",{ .name="sll", .type="R", .func="逻辑左移" }},

{"000000000011",{ .name="sra", .type="R", .func="算术右移" }},

{"000000000010",{ .name="srl", .type="R", .func="逻辑右移" }},

{"000000100000",{ .name="add", .type="R", .func="符号加" }},

{"000000100001",{ .name="addu", .type="R", .func="无符号加" }},

{"000000100010",{ .name="sub", .type="R", .func="符号减" }},

{"000000100100",{ .name="and", .type="R", .func="与" }},

{"000000100101",{ .name="or", .type="R", .func="或" }},

{"000000100111",{ .name="nor", .type="R", .func="或非" }},

{"000000101010",{ .name="slt", .type="R", .func="比较大小,小于则寄存器置1(有符号)" }},

{"000000101011",{ .name="sltu", .type="R", .func="比较大小,小于则寄存器置1(无符号)" }},

{"000000001000",{ .name="jr", .type="J", .func="跳转至寄存器" }},

{"000000001100",{ .name="syscall", .type="SYSCALL", .func="系统调用" }},

{"000010" ,{ .name="j", .type="J", .func="跳转" }},

{"000011" ,{ .name="jal", .type="J", .func="跳转并链接" }},

{"000100" ,{ .name="beq", .type="I", .func="相等时跳转" }},

{"000101" ,{ .name="bne", .type="I", .func="不等时跳转" }},

{"001000" ,{ .name="addi", .type="I", .func="符号加立即数" }},

{"001100" ,{ .name="andi", .type="I", .func="与立即数" }},

{"001001" ,{ .name="addiu", .type="I", .func="无符号立即数加法" }},

{"001010" ,{ .name="slti", .type="I", .func="比较大小,小于立即数则寄存器置1(有符号)" }},

{"001101" ,{ .name="ori", .type="I", .func="或立即数" }},

{"100011" ,{ .name="lw", .type="I", .func="内存加载字到寄存器堆" }},

{"101011" ,{ .name="sw", .type="I", .func="寄存器存储字到内存" }}

};

string HexToBin( string irHex );

int main()

{

string irHex, irBin;

string opCode, funct;

cout << "请输入32位16进制指令:(如12200001)" << endl;

while( cin >> irHex ){

irBin = HexToBin(irHex);

cout << "bianry instruction: " << irBin << endl;//test

opCode = irBin.substr(0,6);//不包括最后一位

funct = irBin.substr(26,-1);

if( transTable.find(opCode+funct) != transTable.end() ){

cout << "name : " << transTable[(opCode+funct)].name << endl;

cout << "type : " << transTable[(opCode+funct)].type << " | "

"function : " << transTable[(opCode+funct)].func <

}

else if( transTable.find(opCode) != transTable.end() ){

cout << "name : " << transTable[(opCode)].name << endl;

cout << "type : " << transTable[(opCode)].type << " | "

"function : " << transTable[(opCode)].func <

}

else{

cout << "this instruction isn't included." << endl;

}

}

return 0;

}

string HexToBin( string irHex )

{

const string numbers = "0123456789";

string irBin;

IRType irDec = 0;

for( string::iterator itr = irHex.begin(); itr != irHex.end(); itr++ ){

irDec *= 16;

if( numbers.find(*itr) != string::npos ){

irDec += ( (*itr) - '0' );

}else{

( *itr ) = tolower(*itr);

irDec += ( (*itr) - 'a' + 10 );

}

}

//cout << irDec << endl;//test

irBin = 1;

irBin = bitset((int)irDec).to_string();

return irBin;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值