8

专家,我想知道 intel x86 machineCode/assemblyCode 转换是单面还是双面?

表示:assemblyCode ---> machineCode 和 machineCode ---> assemblyCode 都可用。

由于 x86 机器代码的大小不同(1-15 字节),操作码也不同(1-3 字节),如何确定一个操作码是 1 字节还是 2 字节或 3 字节?

我从来没有找到x86指令前缀的例子,如果这里是1字节前缀,如何确定它是前缀还是操作码?

当然, assemblyCode ---> machineCode , mnemonics + oprand[w/b] 的标识可以通过映射某个 MappingTable 来确定响应的 machineCode 是什么。

但是,当过程相反时:

{ bbbbbbbb,bbbbbbbb,bbbbbbbb, //指令1 bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,//指令2 bbbbbbbb,bbbbbbbb//指令3 }

----> {bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb}

我不知道哪个是有效位或字节来确定一条指令的长度(多大)。

有人能告诉我如何确定吗?(操作码的大小,前缀示例。)感谢您的帮助。

4

3 回答 3

3

不确定您要完成什么,但由于指令具有可变长度,因此确保您返回正确反汇编代码的唯一方法是从已知的起始地址开始。通常反汇编程序从程序的起点开始,然后递归地反汇编所有调用的方法。

然而,这会导致某些代码块没有被反汇编的情况,因为它们可以从函数表或类似情况中调用,因此通常需要人工帮助来查看剩余部分是代码还是数据。

于 2010-03-09T14:25:22.310 回答
3

您需要的详细信息在英特尔® 64 和 IA-32 架构软件开发人员手册第 2B 卷:指令集参考,新西兰。查看附录 A,它包含您需要的所有内容。

于 2010-03-09T14:29:17.547 回答
2

由于 x86 机器代码的大小不同(1-15 字节),操作码也不同(1-3 字节),如何确定一个操作码是 1 字节还是 2 字节或 3 字节?

指令的大小由指令和地址模式隐式定义,您必须一次检查一个字节的 ISA,什么可以和应该跟随所述字节。

我从来没有找到x86指令前缀的例子,如果这里是1字节前缀,如何确定它是前缀还是操作码?

例如,操作数大小覆盖前缀 (66h) 始终是前缀。

于 2010-03-09T14:25:24.100 回答