操作码稳定性规则

时间:2014-10-18 17:04:10

标签: assembly x86 opcode

因此,每当我在汇编上运行命令并在CPU模式下查看它时,我都有段:offset和之后我有类似命令的操作码。 例如,我运行命令mov ax, 1A1Bh并向我显示:

cs:0005 B81B1A mov ax, 1A1Bh

所以我的问题是,为什么1A1Bh在操作码中显示为1B1A

每当我运行mov ax, dx时,它就会向我显示:

cs:0095 8BC2 mov ax, dx

根据我的理解,'mov'的操作码为Bax的操作码为8,为什么它显示为8BC2

3 个答案:

答案 0 :(得分:2)

x86是little-endian,这意味着多字节整数的低字节存储在较低的地址。因此,为什么直接值的字节以相反的顺序显示。

x86指令编码并不简单 - 你不能总是挑出各种半字节并说“#34;这必须是mov"”。如果您真的想了解指令编码,则需要查看x86指令集参考。

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf

答案 1 :(得分:0)

有许多不同类型的mov。可以表示mov的操作码字节(并非所有字母始终都是mov)是888C8EA0到{{ 1}},A3B0BFC6(如果其ModRM字节中的C7字段,则最后两个仅表示mov是0)。

还有(取决于您要将r/m s mov组合到/来自控制和调试寄存器(mov0F 20)。< / p>

0F 23位于一组指令中,基于目标寄存器(在操作码中编码),跨越B81B1AB8。你看到8是因为目的地是BF,它与ax中的8无关(其中8和B都是操作码的一部分而不是一些偷偷摸摸的操作数)

8B很复杂。您可以找到更多的一致性,例如简单的ALU说明(movaddoradcsbb,{{1 }},andsub分别是0到7),您可以使用相同的函数进行编码,该函数将其索引作为参数,但进一步不关心它是哪一个(那里)当然,在这个功能中仍有几个案例)。其他可能有用的组是没有操作数的&#34;指令&#34;,&#34;具有1个操作数的指令和固定的xor字段&#34;和#34;只有cmp - 表格&#34;

的说明

答案 2 :(得分:0)

由于8086处理器的指令集更基本

Here  是二进制的mov操作码列表(对于8086): Here是解释MOD和R / M

的表格

SR代表段寄存器,它们是ES,CS,SS,DS。

来自datasheet

的参考

显然,不同架构的机器代码会有所不同,但我发现通过从它来自哪里开始学习更容易。

(为简洁起见,指令集编码信息从第263页开始)