表示: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}
我不知道确定一条指令的长度(大小)的有效位或字节是哪一个。
任何人都会告诉我如何确定?(操作码的大小,前缀示例。) 谢谢你的帮助。
答案 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)始终是前缀。