assembly 为什么段寄存器中MOV的操作码没有设置低位?它不是8位操作数大小,所以应该设置W位

qlckcl4x  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(140)

我有一个问题,我不能理解这个指令的操作码MOV BX,CS像第一个字节是10001100,其中第一个6位代表操作码,然后方向1位,然后W。所以这里是我的疑问,为什么在操作码中是100011而不是100010,为什么在W单元格中是0而不是1,比如出于什么目的,或者有一些条件,我应该小心。

如果有人能给予我一个详细的答复,我将不胜感激。
当我试图用一种以上的方法解决时,我就是不能得到上面图片中显示的解决方案,我看了很多视频,但没有找到一个答案来澄清我的疑问。

odopli94

odopli941#

一些操作码不遵循该模式,包括mov到/来自段寄存器的操作码。这些指令没有8位版本,因此低位并不表示Width = 8与16位
低2位是方向和宽度并不通用,它只是存在于大多数普通ALU操作码中的一种模式,这些操作码成对出现,用于8位和16/32/64位操作数大小1,如andaddcmp等。其具有两个方向,立即形式具有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

  • 8Cmov r/m, Sreg,也就是你要问的操作码。
  • 8Dlea
  • 8Emov Sreg, r/m(它确实存在,设置了d位,并且与ModRM的/r字段中的CS以外的任何段reg一起工作。可以使用CS目标对其进行编码,但在8086之后,它将在CPU上引发#UD异常。8086没有非法教学的例外每个比特模式都作为某种东西运行。一些8086型号甚至运行mov到CS作为跳转。
  • 8Fpop r/m

有关http://ref.x86asm.net/coder32.html#x8C操作码的指令列表,请参见www.example.com。该模式还有许多其他例外,例如clisti分别是FA和FB。
脚注1:16/32/64位操作数大小都具有相同的操作码。默认值由当前模式隐含。66h前缀设置16位或32位的相反值,或者雷克斯.W前缀选择64位。
在设计386和AMD 64时,没有新操作码的空间,所以他们用前缀代替。

相关问题