我有一个问题,我不能理解这个指令的操作码MOV BX,CS像第一个字节是10001100,其中第一个6位代表操作码,然后方向1位,然后W。所以这里是我的疑问,为什么在操作码中是100011而不是100010,为什么在W单元格中是0而不是1,比如出于什么目的,或者有一些条件,我应该小心。
如果有人能给予我一个详细的答复,我将不胜感激。当我试图用一种以上的方法解决时,我就是不能得到上面图片中显示的解决方案,我看了很多视频,但没有找到一个答案来澄清我的疑问。
odopli941#
一些操作码不遵循该模式,包括mov到/来自段寄存器的操作码。这些指令没有8位版本,因此低位并不表示Width = 8与16位低2位是方向和宽度并不通用,它只是存在于大多数普通ALU操作码中的一种模式,这些操作码成对出现,用于8位和16/32/64位操作数大小1,如and,add,cmp等。其具有两个方向,立即形式具有16位操作数大小的imm16和符号扩展imm8,以及没有ModRM的al, imm8/ax, imm16短编码。还有像shr这样的,没有两个方向,但有两个大小。甚至非段寄存器的mov也有一些特殊的形式,其中mov reg, imm形式的寄存器编号为操作码的低3位,而不是方向或宽度。没有mov r/m16, sign_extended_imm8,因为8086没有使用它。(https://www.felixcloutier.com/x86/mov显示了各种mov操作码。)您看到的mov r/m, Sreg操作码是8 C。低2位值不同的四个操作码包括mov Sreg, r/m,但也有两个不相关的操作码,它们都设置了低位,并且都只存在于16位操作数大小的形式中,因此对于它们中的任何一个都不意味着W。虽然它确实适用于莱亚和pop。
mov
and
add
cmp
imm16
imm8
al, imm8
ax, imm16
shr
mov reg, imm
mov r/m16, sign_extended_imm8
mov r/m, Sreg
mov Sreg, r/m
pop
8C
8D
lea
8E
8F
pop r/m
有关http://ref.x86asm.net/coder32.html#x8C操作码的指令列表,请参见www.example.com。该模式还有许多其他例外,例如cli和sti分别是FA和FB。脚注1:16/32/64位操作数大小都具有相同的操作码。默认值由当前模式隐含。66h前缀设置16位或32位的相反值,或者雷克斯.W前缀选择64位。在设计386和AMD 64时,没有新操作码的空间,所以他们用前缀代替。
cli
sti
66h
1条答案
按热度按时间odopli941#
一些操作码不遵循该模式,包括
mov
到/来自段寄存器的操作码。这些指令没有8位版本,因此低位并不表示Width = 8与16位低2位是方向和宽度并不通用,它只是存在于大多数普通ALU操作码中的一种模式,这些操作码成对出现,用于8位和16/32/64位操作数大小1,如
and
,add
,cmp
等。其具有两个方向,立即形式具有16位操作数大小的imm16
和符号扩展imm8
,以及没有ModRM的al, imm8
/ax, imm16
短编码。还有像shr
这样的,没有两个方向,但有两个大小。甚至非段寄存器的
mov
也有一些特殊的形式,其中mov reg, imm
形式的寄存器编号为操作码的低3位,而不是方向或宽度。没有mov r/m16, sign_extended_imm8
,因为8086没有使用它。(https://www.felixcloutier.com/x86/mov显示了各种mov操作码。)您看到的
mov r/m, Sreg
操作码是8 C。低2位值不同的四个操作码包括mov Sreg, r/m
,但也有两个不相关的操作码,它们都设置了低位,并且都只存在于16位操作数大小的形式中,因此对于它们中的任何一个都不意味着W。虽然它确实适用于莱亚和pop
。8C
是mov r/m, Sreg
,也就是你要问的操作码。8D
是lea
8E
是mov Sreg, r/m
(它确实存在,设置了d位,并且与ModRM的/r字段中的CS以外的任何段reg一起工作。可以使用CS目标对其进行编码,但在8086之后,它将在CPU上引发#UD异常。8086没有非法教学的例外每个比特模式都作为某种东西运行。一些8086型号甚至运行mov到CS作为跳转。8F
是pop r/m
。有关http://ref.x86asm.net/coder32.html#x8C操作码的指令列表,请参见www.example.com。该模式还有许多其他例外,例如
cli
和sti
分别是FA和FB。脚注1:16/32/64位操作数大小都具有相同的操作码。默认值由当前模式隐含。
66h
前缀设置16位或32位的相反值,或者雷克斯.W前缀选择64位。在设计386和AMD 64时,没有新操作码的空间,所以他们用前缀代替。