intel机器码转汇编代码的问题
专家,我想知道intel x86机器代码/汇编代码转换是singleSide还是bothSide?
意思是:汇编代码---> machineCode 和 machineCode ---> assemblyCode 都可用。
由于x86机器代码的大小不同(1-15字节),并且操作码的大小不同(1-3字节),如何确定一个操作码是1字节、2字节还是3字节?
我从来没有找到x86指令前缀的例子,如果这里是1字节前缀,如何确定它是前缀还是操作码?
当然,汇编代码---> machineCode ,助记符 + oprand[w/b] 的标识可以通过映射某个 MappingTable 来确定响应的 machineCode 是什么。
但是,当过程相反时:
{ bbbbbbbb,bbbbbbbb,bbbbbbbb, //instruction1 bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,//指令2 bbbbbbbb,bbbbbbbb//指令3 }
----> {bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb,bbbbbbbb}
我不知道哪个是有效位或字节来确定一条指令的长度(大小)。
有人能告诉我如何确定吗?(操作码的大小,前缀示例。) 谢谢你的帮助。
experts,i wonder the intel x86 machineCode/assemblyCode conversion is singleSide or bothSide?
means: assemblyCode ---> machineCode and machineCode ---> assemblyCode are both available.
since the x86 machineCode is vary in size (1-15 byte),and opcode vary in (1-3 byte),how to determine one opcode is 1byte or 2byte or 3byte ?
and i never found the example of prefix of x86 instructions,if here is 1byte prefix,how to determine it is prefix or opcode?
certainly, the assemblyCode ---> machineCode , the identity of mnemonics + oprand[w/b] can determine what the response machineCode is by maping certain MappingTable.
but,when the process is reversed:
{ 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}
i don't know which is the significant bits or byts to determined how long(what size) one instruction is.
would any one tells me how to determine that?(the size of opcode,the prefix example.)
thanks for help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您需要的详细信息位于英特尔® 64 和 IA-32 架构软件开发人员手册第 2B 卷:指令集参考,新西兰。看看附录A,它包含了你需要的一切。
The details you need are in Intel® 64 and IA-32 ArchitecturesSoftware Developer’s Manual Volume 2B: Instruction Set Reference, N-Z. Look at Appendix A, it includes everything you need.
不确定您想要完成什么,但由于指令的长度可变,确保返回正确反汇编代码的唯一方法是从已知的起始地址开始。通常反汇编程序从程序的起点开始,然后递归地反汇编所有调用的方法。
然而,这会导致某些代码块没有被反汇编的情况,因为它们可以从函数表中调用或类似的情况,因此通常需要人类的帮助来查看剩余的部分是代码还是数据。
Not sure what you want to accomplish, but since the instructions have variable length the only way to be sure you get back the correctly disassembled code is to start from a known start address. Usually disassemblers start from the starting point of the program and then recursively disassemble all methods called.
However this leads to situations where some code chunks are not disassembled because they can be called from a function table or similar situations, so it needs help from a human usually to see if the remaining sections are code or data.
指令的大小由指令和地址模式隐式定义,您必须一次检查 ISA 一个字节,该字节后面可以并且应该遵循什么内容。
例如,操作数大小覆盖前缀 (66h) 始终是前缀。
The size of the instructed is implicitly defined by instruction and address mode, you will have to check the ISA one byte at a time what can and should follow said byte.
For example, the operand size override prefix (66h) is always a prefix.