intel机器码转汇编代码的问题

发布于 2024-08-24 09:40:55 字数 721 浏览 11 评论 0原文

专家,我想知道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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浪荡不羁 2024-08-31 09:40:55

您需要的详细信息位于英特尔® 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.

哀由 2024-08-31 09:40:55

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

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

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.

高速公鹿 2024-08-31 09:40:55

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

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

我从来没有找到过这样的例子
x86指令的前缀,如果这里是
1byte前缀,如何判断是
前缀或操作码?

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

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?

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.

and i never found the example of
prefix of x86 instructions,if here is
1byte prefix,how to determine it is
prefix or opcode?

For example, the operand size override prefix (66h) is always a prefix.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文