Assembly 操作码恒定性规则
所以,每当我在汇编上运行一个命令并在CPU模式下查看它时,我都会得到segment:offset,然后我就会得到类似于该命令的操作码。 例如,我运行命令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
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好的,你实际上在做什么?这现在没有什么意义。