我有这部分代码:
mov ax, 0x100
mov es, ax
但是当我尝试用这个替换上面的代码时:
mov es, 0x100
nasm告诉我,我做了invalid combination of opcode and operands
。为什么?
答案 0 :(得分:4)
那是因为没有可以将文字值移动到es
寄存器的指令。
对于源和目标的不同组合,有不同的mov
指令。有一个指令将文字值移动到寄存器,但它只能将它移动到某些寄存器,而不是所有寄存器。这就是为什么在将值移到段寄存器之前需要将值放在数据寄存器中的原因。
答案 1 :(得分:1)
没有文字es
加载指令。假设段寄存器具有魔术cookie。这些只能在加载时或运行时确定。因此编译器和汇编器无法知道准备加载哪个文字常量。
但是,有一条加载ES
和索引寄存器的指令:
far_ptr dd ?
...
LES DI, far_ptr
这将ES和16位寄存器DI
设置为标记为far_ptr
的内存中的32位值,这可能会有用地加载大型模型指针。
还有32位指令兄弟。其他段寄存器和索引寄存器可以这种方式设置。请参阅this。