专家,我想知道intel x86机器代码/汇编代码转换是singleSide还是bothSide?

方法:assemblyCode ---> machineCode 和 machineCode ---> assemblyCode 均可用。

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

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

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

但是,当过程相反时:

{ bbbbbbbb,bbbbbbbb,bbbbbbbb, //instruction1 bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,//instruction2 bbbbbbbb,bbbbbbbb//instruction3 }

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

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

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

有帮助吗?

解决方案

您需要的详细信息在 英特尔® 64 和 IA-32 架构软件开发人员手册第 2B 卷:指令集参考,N-Z. 。看看附录A,它包含了你需要的一切。

其他提示

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

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

由于X86 Machinecode的大小变化(1-15个字节),并且OpCode在(1-3个字节)中变化,因此如何确定一个OpCode是1 Byce,或2 Byte或2byte或3byte?

指令的大小由指令和地址模式隐式定义,您必须一次检查 ISA 一个字节,该字节后面可以并且应该遵循什么内容。

而且我从来没有找到x86指令前缀的示例,如果这里有1byte前缀,那么如何确定它是前缀或opcode?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top