因此,每当我在汇编上运行命令并在CPU模式下查看它时,我都有段:offset和之后我有类似命令的操作码。
例如,我运行命令mov ax, 1A1Bh
并向我显示:
cs:0005 B81B1A mov ax, 1A1Bh
所以我的问题是,为什么1A1Bh
在操作码中显示为1B1A
?
每当我运行mov ax, dx
时,它就会向我显示:
cs:0095 8BC2 mov ax, dx
根据我的理解,'mov'的操作码为B
,ax
的操作码为8
,为什么它显示为8BC2
?
答案 0 :(得分:2)
x86是little-endian,这意味着多字节整数的低字节存储在较低的地址。因此,为什么直接值的字节以相反的顺序显示。
x86指令编码并不简单 - 你不能总是挑出各种半字节并说“#34;这必须是mov"”。如果您真的想了解指令编码,则需要查看x86指令集参考。
答案 1 :(得分:0)
有许多不同类型的mov
。可以表示mov
的操作码字节(并非所有字母始终都是mov
)是88
到8C
,8E
,A0
到{{ 1}},A3
到B0
,BF
和C6
(如果其ModRM字节中的C7
字段,则最后两个仅表示mov
是0)。
还有(取决于您要将r/m
s mov
组合到/来自控制和调试寄存器(mov
到0F 20
)。< / p>
0F 23
位于一组指令中,基于目标寄存器(在操作码中编码),跨越B81B1A
到B8
。你看到8是因为目的地是BF
,它与ax
中的8无关(其中8和B都是操作码的一部分而不是一些偷偷摸摸的操作数)
8B
很复杂。您可以找到更多的一致性,例如简单的ALU说明(mov
,add
,or
,adc
,sbb
,{{1 }},and
,sub
分别是0到7),您可以使用相同的函数进行编码,该函数将其索引作为参数,但进一步不关心它是哪一个(那里)当然,在这个功能中仍有几个案例)。其他可能有用的组是没有操作数的&#34;指令&#34;,&#34;具有1个操作数的指令和固定的xor
字段&#34;和#34;只有cmp
- 表格&#34;
答案 2 :(得分:0)