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

标签 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

最佳答案

通常,反汇编器将包含表和“解码类型”(通常是函数指针或进入 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 处理器做这件事!等说明。

[而且我已经花了太长时间解释如何做到这一点以获得“正确答案”——尽管这是你如何做到这一点的正确答案——当然,使用一个已经存在的库显然更简单方法]。

关于C++ 将字节转换为操作码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14429820/

相关文章:

c++ - 如何在派生类上强制使用静态成员?

c++ - 有趣的C++依赖注入(inject)方案

c++ - PROCESSENTRY32 .dwSize 和 sizeof

java - 在 Android Java 中将位保存在字节流中?

Android小问题

c# - .NET 中用于 Windows 应用商店应用程序 API 的 Emit.OpCodes 的用途?

c++ - QStandardItemModel 在其余项之上附加新项

c++ - 如何在 Qt/C++ 中创建属性绑定(bind)?

c# - 通过套接字将 C# 结构发送到 C++

Erlang 操作码及其含义