`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。
我有这部分代码:
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。