oll*_*dbg 4 math assembly machine-code
8B EC 56 8B F4 68 00 70 40 00 FF 15 BC 82 40
Run Code Online (Sandbox Code Playgroud)
像上面这样的序列可以用各种方式进行分段,每个段都可以转换为相应的汇编指令,但是每个二进制可执行文件都有它唯一的DEFINITE汇编,什么是避免歧义的数学原理?
UPDATE
大多数选票的答案实际上并没有回答我的问题.
Vil*_*lx- 13
知道你的出发点.
换句话说,给定指令的特定起始字节,指令结束的位置是明确的,从而为您提供下一条指令的起始字节并允许您继续.给定一个任意的内存块,不可能在不知道第一条指令开始的地方将其分解为单独的指令.
从更加数学的角度来看,没有有效指令,其字节是另一个有效指令的前缀.因此,如果ab有效,那么您知道它ab cd不能有效,因此ab必须是一条指令,并且cd是下一条指令的开始.
如果我正确理解你的问题,那么你正在尝试理解为什么
8B EC 56 8B F4 68 00 70 40 00 FF 15 BC 82 40
可以拆分为
8BEC 568BF4 68007040 00FF 15BC 8240
而不是说,
8B EC568B F4 68007040 00FF 15BC 8240
这完全由您的架构的 ISA 指定。该文档准确地描述了如何从一系列字节独特地构造指令。
为了使 ISA 格式良好,单个字节系列最多可以对应于单个解码指令系列(如果存在无效指令,则可能会更少)。
为了更具体一点,让我们以 x86 为例:如果您想知道每个字节对应什么,请看这里。
您会看到,例如,以 00 开头的指令是一条添加指令(附加参数位于下一个字节中,具有特定的编码)。
您还会看到某些值实际上是修改以下指令的前缀(0F - 扩展操作码空间的前缀,26、2E、36、3E、64、65、66、67、F0、F2、F3),以及其中一些根据下面的确切说明具有不同的含义。这些不是操作码,但它们可以改变操作码参数的编码,或者引入全新的操作码空间(例如SSE使用0F)。
总的来说,x86 编码非常复杂,感谢反汇编程序。