intel机器码到汇编代码问题

时间:2010-03-09 14:18:26

标签: assembly x86 format intel opcode

专家,我想知道intel x86 machineCode / assemblyCode转换是singleSide还是BothSide?

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

由于x86 machineCode的大小不同(1-15字节),并且操作码在(1-3字节)内变化,如何确定一个操作码是1byte还是2byte还是3byte?

我从未找到x86指令的前缀示例,如果这里是1byte前缀,如何确定它是前缀还是操作码?

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

但是,当过程逆转时:

{bbbbbbbb,bbbbbbbb,bbbbbbbb,// instruction1   BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,//指令2   BBBBBBBB,BBBBBBBB // instruction3 }

----> {BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB,BBBBBBBB}

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

任何人都会告诉我如何确定?(操作码的大小,前缀示例。) 谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

您需要的详细信息位于Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual Volume 2B: Instruction Set Reference, N-Z。看附录A,它包含了你需要的一切。

答案 2 :(得分:2)

  

因为x86 machineCode有所不同   大小(1-15字节),操作码有所不同   (1-3字节),如何确定一个操作码   是1byte还是2byte还是3byte?

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

  

我从未找到过这个例子   x86指令的前缀,如果是的话   1byte前缀,如何确定它   前缀或操作码?

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