C++将字节转换为操作码?

Xor*_*orr 1 c++ byte opcodes

我不确定如何说出这个问题但是,我很想知道汇编程序和其他工具如何显示某些字节的操作码?

std::string BytesToOpcode( __in ::BYTE Bytes );

int main( void )
{
    std::cout << BytesToOpcode( ( ::PBYTE )"\x33\xC0" );
    std::cin.get( );
    return( EXIT_SUCCESS );
};

// I don't know what type soo I'll just set as std::string for an example.
std::string BytesToOpcode( __in ::BYTE Bytes )
{
    // Convert Bytes to opcode??
    return( "" );
};


Output should be:
XOR EAX,EAX
Run Code Online (Sandbox Code Playgroud)

Mat*_*son 5

通常,反汇编程序将具有表和"解码类型"(通常是函数指针或进入switch语句的东西)的组合 - 解码类型告诉指令是哪个类 - 例如,xor, or, and, add, sub将具有相同的解码,但call, jmp将是一个不同的解码.jnz, jz, jnc, jc, ja, jb, jbe, etc会有另一种解码类型.

所以第一级表将是256条表.然后你有一些"前缀"的条目,例如0xff,下一个字节告诉指令"真的是".再次,你得到一个256 prefix0xff条目表的表.

有些条目可能无效,因为到目前为止并未采用所有组合[尽管几乎全部].

一个棘手的问题是"修饰符前缀"条目.例如,0x66将指令从32位切换到16位操作数(如果处理器处于16位模式,则反之亦然).

很多每个类别内的实际解码的将涉及摆弄位和翻译"比特5-3"注册号码或"位1-2"解决模式(它是eax,[eax][eax+esi],例如).

这是相当多的工作.我为80186写了一个反汇编程序,这花了我两天几天的工作.但是,我已经知道我在做什么.将它转换为386需要另外2-3天,我不想考虑使用所有SSE,MMX,3DNow的现代x86处理器!等指令.

[我已经花了很长时间解释如何做到这一点以获得"正确答案" - 即使这是你如何做到的正确答案 - 当然,使用现有的库显然是更简单的方法它].