`mov` ES 寄存器的文字

`mov` a literal to the ES register

我有这部分代码:

mov ax, 0x100
mov es, ax

但是当我尝试用这个替换上面的代码时:

mov es, 0x100

nasm 告诉我我做了一个 invalid combination of opcode and operands。为什么?

那是因为没有指令可以将文字值移动到 es 寄存器。

对于不同的源和目标组合,有不同的 mov 说明。有一条将文字值移动到寄存器的指令,但它只能将其移动到某些寄存器,而不是所有寄存器。这就是为什么在将值移动到段寄存器之前需要将值放入数据寄存器。

没有文字 es 加载指令。假设段寄存器有魔法饼干。这些只能在加载时或 运行 时确定。所以编译器和汇编器不知道准备加载什么文字常量。

但是,有一个加载指令ES和一个变址寄存器:

far_ptr   dd       ?
        ...
          LES DI, far_ptr

这会将 ES 和 16 位寄存器 DI 设置为标记为 far_ptr 的内存中的 32 位值,这可以有效地加载大型模型指针。

还有 32 位指令兄弟。其他段寄存器和变址寄存器都可以这样设置。参见 this