1

我已将特定数据存储在内存位置0x4000上。我想将一个字节从那里传递到内存位置0xb800,以便将数据打印在屏幕上。当我尝试将我假设在0x4000:0中的第一个字节存储在0xb800:0中时,就会出现问题。我用作示例的代码如下:

mov ax, 0xb800
mov es, ax
mov byte [es:0], 'A'

这可以很好地编译并完美运行,但是我正在尝试适应的内容会在 NASM 上引发“无效段覆盖”错误。这是我的非工作代码:

mov ax, 0xb800
mov es, ax
mov byte [es:0], byte [0x4000:0]

是否可以使用 ES 段从 0x4000:[offset] 获取单个字节并将其馈送到 0xb800:[offset] ?如果是这样,怎么做?

4

1 回答 1

1

你可以做到这一点,但你不能像你一样在一条指令中做到这一点。您需要使用另一个段寄存器,例如ds,加上一个中间寄存器(al此处):

mov ax, 0x4000
mov ds, ax
mov ax, 0xb800
mov es, ax
mov al, [ds:0]
mov [es:0], al

请注意,如果您已经ds指向其他地方,那么您也会考虑到这一点(例如通过保存和恢复它)。

于 2012-08-16T03:12:37.447 回答