Как я могу передать байты в видеопамять из другого места в 16-битной сборке?

Я сохранил определенные данные в ячейке памяти 0x4000. Я хотел передать байт оттуда в ячейку памяти 0xb800, чтобы данные печатались на экране. Проблема возникает, когда я пытаюсь сохранить в 0xb800:0 свой первый байт, который, как я полагаю, находится в 0x4000: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]

Можно ли получить один байт из 0x4000:[смещение] и передать его в 0xb800:[смещение] с помощью сегмента ES? Если да, то как?


person NorthStyling    schedule 16.08.2012    source источник


Ответы (1)


Вы можете сделать это, но вы не можете сделать это в одной инструкции, как у вас. Вам нужно будет использовать другой сегментный регистр, например ds, плюс промежуточный регистр (здесь al):

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

Обратите внимание, что если вы указали ds где-то еще, вам придется это учитывать (например, путем сохранения и восстановления).

person Greg Hewgill    schedule 16.08.2012