Line 6... |
Line 6... |
* This module implements members of the Disassembler class.
|
* This module implements members of the Disassembler class.
|
*/
|
*/
|
|
|
#include "disassembler.h"
|
#include "disassembler.h"
|
|
|
#include <sstream>
|
|
#include <stdexcept>
|
#include <stdexcept>
|
|
|
/*
|
/*
|
* Disassembler::Operand class members
|
* Disassembler::Operand class members
|
*/
|
*/
|
Line 211... |
Line 210... |
int value=(w>>16)&0xFF;
|
int value=(w>>16)&0xFF;
|
return Operand(Operand::Register,value);
|
return Operand(Operand::Register,value);
|
}
|
}
|
|
|
std::string Disassembler::decodeSimpleInstruction(const std::string &op,Word w) {
|
std::string Disassembler::decodeSimpleInstruction(const std::string &op,Word w) {
|
std::ostringstream oss;
|
|
auto dst=decodeDstOperand(w);
|
auto dst=decodeDstOperand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
oss<<op<<' '<<str(dst)<<", "<<str(rd1)<<", "<<str(rd2);
|
return op+' '+str(dst)+", "+str(rd1)+", "+str(rd2);
|
return oss.str();
|
|
}
|
}
|
|
|
std::string Disassembler::decodeAdd(Word w) {
|
std::string Disassembler::decodeAdd(Word w) {
|
std::ostringstream oss;
|
|
|
|
auto dst=decodeDstOperand(w);
|
auto dst=decodeDstOperand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
|
|
if(rd2.type()==Operand::Direct&&rd2.value()==0&&_preferAliases)
|
if(rd2.type()==Operand::Direct&&rd2.value()==0&&_preferAliases)
|
oss<<"mov "<<str(dst)<<", "<<str(rd1);
|
return "mov "+str(dst)+", "+str(rd1);
|
else
|
else
|
oss<<"add "<<str(dst)<<", "<<str(rd1)<<", "<<str(rd2);
|
return "add "+str(dst)+", "+str(rd1)+", "+str(rd2);
|
|
|
return oss.str();
|
|
}
|
}
|
|
|
std::string Disassembler::decodeAnd(Word w) {
|
std::string Disassembler::decodeAnd(Word w) {
|
return decodeSimpleInstruction("and",w);
|
return decodeSimpleInstruction("and",w);
|
}
|
}
|
Line 337... |
Line 330... |
if(operand&0x00100000) operand|=0xFFE00000;
|
if(operand&0x00100000) operand|=0xFFE00000;
|
return "lcs "+str(dst)+", 0x"+hex(operand);
|
return "lcs "+str(dst)+", 0x"+hex(operand);
|
}
|
}
|
|
|
std::string Disassembler::decodeLsb(Word w) {
|
std::string Disassembler::decodeLsb(Word w) {
|
std::ostringstream oss;
|
|
|
|
auto dst=decodeDstOperand(w);
|
auto dst=decodeDstOperand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
|
|
if(rd1.type()!=Operand::Register) return decodeWord(w);
|
if(rd1.type()!=Operand::Register) return decodeWord(w);
|
Line 350... |
Line 341... |
|
|
return "lsb "+str(dst)+", "+str(rd1);
|
return "lsb "+str(dst)+", "+str(rd1);
|
}
|
}
|
|
|
std::string Disassembler::decodeLub(Word w) {
|
std::string Disassembler::decodeLub(Word w) {
|
std::ostringstream oss;
|
|
|
|
auto dst=decodeDstOperand(w);
|
auto dst=decodeDstOperand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
|
|
if(rd1.type()!=Operand::Register) return decodeWord(w);
|
if(rd1.type()!=Operand::Register) return decodeWord(w);
|
Line 363... |
Line 352... |
|
|
return "lub "+str(dst)+", "+str(rd1);
|
return "lub "+str(dst)+", "+str(rd1);
|
}
|
}
|
|
|
std::string Disassembler::decodeLw(Word w) {
|
std::string Disassembler::decodeLw(Word w) {
|
std::ostringstream oss;
|
|
|
|
auto dst=decodeDstOperand(w);
|
auto dst=decodeDstOperand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
|
|
if(rd1.type()!=Operand::Register) return decodeWord(w);
|
if(rd1.type()!=Operand::Register) return decodeWord(w);
|
Line 401... |
Line 388... |
std::string Disassembler::decodeOr(Word w) {
|
std::string Disassembler::decodeOr(Word w) {
|
return decodeSimpleInstruction("or",w);
|
return decodeSimpleInstruction("or",w);
|
}
|
}
|
|
|
std::string Disassembler::decodeSb(Word w) {
|
std::string Disassembler::decodeSb(Word w) {
|
std::ostringstream oss;
|
|
|
|
auto dst=decodeDstOperand(w);
|
auto dst=decodeDstOperand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
|
|
if(dst.value()!=0) return decodeWord(w);
|
if(dst.value()!=0) return decodeWord(w);
|
Line 432... |
Line 417... |
if(rd2.type()==Operand::Direct&&(rd2.value()<0||rd2.value()>31)) return decodeWord(w);
|
if(rd2.type()==Operand::Direct&&(rd2.value()<0||rd2.value()>31)) return decodeWord(w);
|
return decodeSimpleInstruction("sru",w);
|
return decodeSimpleInstruction("sru",w);
|
}
|
}
|
|
|
std::string Disassembler::decodeSub(Word w) {
|
std::string Disassembler::decodeSub(Word w) {
|
std::ostringstream oss;
|
|
|
|
auto dst=decodeDstOperand(w);
|
auto dst=decodeDstOperand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
|
|
if(rd1.type()==Operand::Direct&&rd1.value()==0&&_preferAliases)
|
if(rd1.type()==Operand::Direct&&rd1.value()==0&&_preferAliases)
|
oss<<"neg "<<str(dst)<<", "<<str(rd2);
|
return "neg "+str(dst)+", "+str(rd2);
|
else
|
else
|
oss<<"sub "<<str(dst)<<", "<<str(rd1)<<", "<<str(rd2);
|
return "sub "+str(dst)+", "+str(rd1)+", "+str(rd2);
|
|
|
return oss.str();
|
|
}
|
}
|
|
|
std::string Disassembler::decodeSw(Word w) {
|
std::string Disassembler::decodeSw(Word w) {
|
std::ostringstream oss;
|
|
|
|
auto dst=decodeDstOperand(w);
|
auto dst=decodeDstOperand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
|
|
if(dst.value()!=0) return decodeWord(w);
|
if(dst.value()!=0) return decodeWord(w);
|
Line 460... |
Line 439... |
|
|
return "sw "+str(rd1)+", "+str(rd2);
|
return "sw "+str(rd1)+", "+str(rd2);
|
}
|
}
|
|
|
std::string Disassembler::decodeXor(Word w) {
|
std::string Disassembler::decodeXor(Word w) {
|
std::ostringstream oss;
|
|
|
|
auto dst=decodeDstOperand(w);
|
auto dst=decodeDstOperand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd1=decodeRd1Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
auto rd2=decodeRd2Operand(w);
|
|
|
if(rd2.type()==Operand::Direct&&rd2.value()==-1&&_preferAliases)
|
if(rd2.type()==Operand::Direct&&rd2.value()==-1&&_preferAliases)
|
oss<<"not "<<str(dst)<<", "<<str(rd1);
|
return "not "+str(dst)+", "+str(rd1);
|
else
|
else
|
oss<<"xor "<<str(dst)<<", "<<str(rd1)<<", "<<str(rd2);
|
return "xor "+str(dst)+", "+str(rd1)+", "+str(rd2);
|
|
|
return oss.str();
|
|
}
|
}
|
|
|
std::string Disassembler::decodeWord(Word w) {
|
std::string Disassembler::decodeWord(Word w) {
|
return ".word 0x"+hex(w);
|
return ".word 0x"+hex(w);
|
}
|
}
|