为什么这两条指令有相同的操作码?

Why do these two instructions have the same opcode?

我正在做一些汇编编程(实际上是在写一个汇编程序),我注意到 MOV EBX, <something>MOV BX, <something> 有相同的操作码 0xBB!为什么会这样,处理器如何区分两者?它是否根据第二个操作数的大小进行区分?而这就是为什么说80386指令集复杂的原因吗?

默认操作数大小由当前操作模式定义,您可以使用 0x66 前缀进行切换。当运行 在 32 位模式下 0xBB 是 32 位移动,而 0x66 0xBB 是 16 位。在16位模式下,情况正好相反。

在 32 位模式下:

66 BB 34 12               mov bx, 0x1234
BB 78 56 34 12            mov ebx, 0x12345678

在 16 位模式下:

BB 34 12                  mov bx, 0x1234
66 BB 78 56 34 12         mov ebx, 0x12345678