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

问题描述

x86机器代码中的指令是可变长度的。我已经深入研究the x86 instruction set。我已经读过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机器代码,我如何确定下一条指令的起始位置?

解决方法

没有明确的标记。您需要依次解码每条指令。每条指令都有一定的长度,下一条指令紧随其后。

如果查看更现代的可变长度编码(例如UTF-8),则会发现它们在逻辑上比x86指令集定义得更多。那只是吸取的教训的结果。 ARM也吸取了教训,并将所有指令设为32位。