查看 x86 机器码,如何确定下一条指令的起始位置?

Looking at x86 machine code, how do I determine the starting location of the next instruction?

x86机器码指令是变长的。我研究过the x86 instruction set thoroughly. I've read about how to convert assembly to machine code。但是到目前为止,在我的任何学习中我都没有看到(也许我错过了什么)处理器如何知道一条指令在哪里结束以及下一条指令从哪里开始。

取以下内容:

XOR CL, [12H] = 00110010 00001110 00010010 00000000 = 32H 0EH 12H 00H
XOR CL, 12H = 10000000 11110001 00010010 = 80 F1 12

如果我正在查看:

00110010 00001110 00010010 00000000 10000000 11110001 00010010 ...
32H 0EH 12H 00H 80 F1 12 ...
                ^
How do I know the next instruction starts here?

当我研究网络中的 OSI 模型时,数据包会通过在每个组件的开头包含一个值告诉您该层将包含多少内容来解决可变层大小问题。但是 CPU 指令比数据包紧凑得多,而且似乎不包含它。

为什么?我到底想做什么?

我的目标是分析程序的机器代码(没有反汇编程序 - 我需要最大的处理速度来分析大量数据,而反汇编程序比我需要做的,比如将二进制语法映射到字符串语法)并记录有关所用操作码的某些统计信息。但我显然必须弄清楚一条指令在哪里结束,下一条指令从哪里开始。

看x86机器码,如何确定下一条指令的起始位置?

只是没有明确的标记。您需要依次解码每条指令。每条指令都有一定的长度,紧接着是下一条指令。

如果您查看更现代的 variable-length 编码,例如 UTF-8,您会发现它们的定义比 x86 指令集更具逻辑性。这只是吸取教训的结果。 ARM也吸取了教训,把所有指令都变成了32位