Assembly 操作码恒定性规则

Assembly 操作码恒定性规则,assembly,x86,opcode,Assembly,X86,Opcode,所以,每当我在汇编上运行一个命令并在CPU模式下查看它时,我都会得到segment:offset,然后我就会得到类似于该命令的操作码。 例如,我运行命令mov ax,1A1Bh,它向我显示: cs:0005 B81B1A mov ax, 1A1Bh cs:0095 8BC2 mov ax, dx 所以我的问题是,为什么操作码中的1A1Bh显示为1B1A 每当我运行mov ax,dx时,它都会显示: cs:0005 B81B1A mov ax, 1A1Bh cs:0095 8BC2 mov

所以,每当我在汇编上运行一个命令并在CPU模式下查看它时,我都会得到segment:offset,然后我就会得到类似于该命令的操作码。 例如,我运行命令
mov ax,1A1Bh
,它向我显示:

cs:0005 B81B1A mov ax, 1A1Bh
cs:0095 8BC2 mov ax, dx
所以我的问题是,为什么操作码中的
1A1Bh
显示为
1B1A

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

cs:0005 B81B1A mov ax, 1A1Bh
cs:0095 8BC2 mov ax, dx

据我所知,“mov”的操作码是
B
,而
ax
的操作码是
8
,那么为什么它会显示为
8BC2

x86是小端,这意味着多字节整数的低位字节存储在低位地址。因此,为什么立即数的字节以相反的顺序显示

x86指令编码并不简单——您不能总是挑选出各种半字节并说“这一定是mov”。如果您真的想了解指令编码,您需要查看x86指令集参考


有许多不同类型的
mov
。表示
mov
的操作码字节(并非所有字节都表示
mov
)是
88
8C
8E
A0
A3
B0
BF
C6
C7
(如果ModRM字节中的
r/m
字段为0,则最后两个仅表示
mov

还有(取决于您想用
mov
s分组的内容)
mov
s到/从控制和调试寄存器(
0F 20
0F 23

B81B1A
位于一组指令中,这些指令基于目标寄存器(在操作码中编码)跨越
B8
BF
。您看到的8是因为目标是
ax
,它与
8B
中的8无关(其中8和B都是操作码的一部分,而不是一些狡猾的操作数)


mov
是复杂的。你会发现它与简单的ALU指令更加一致(
add
adc
sbb
sub
xor
cmp
分别是0到7),您可以使用相同的函数进行编码,该函数以其索引作为参数,但不关心它是哪一个(当然,该函数中仍有几种情况)。其他可能有用的组包括“无操作数的指令”、“有1个操作数和固定
r
字段的指令”和“只有
r,r/m
-形式的指令”

,因为8086处理器的指令集更基本

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

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

来自

显然,不同体系结构的机器代码会有所不同,但我发现从它的来源开始学习更容易


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

I推测“这一定是mov"因为我运行了很多次,它没有改变。我检查了链接,它并没有真正帮助我。我需要在操作码中找到汇编的恒常性…我不知道你在说什么。该文档是关于x86汇编的任何问题的参考。某些位定义操作码,而其他位指定操作数。有什么吗你想实现的具体目标?你能解释一下,比如说,assmebly选择以什么方式为mov ax,dx生成操作码吗?@DorianShullman在说出操作码应该是什么之前,你也必须解析操作数。我如何确定操作数?我实际上没有使用它们,我只是编写了mov寄存器的变体,register@DorianShullman你只需要知道它们是什么。如果你写的是
ax,dx
,那么很明显你已经知道它们是什么了。@DorianShullman好的,你实际上在做什么?这现在没有什么意义。