Прямая работа с видеопамятью

видеокартаМы уже рассмотрели вывод на экран при помощи средств MS-DOS и BIOS. Теперь рассмотрим возможность вывода на экран с использованием прямой работы с видеопамятью. Для этого нужно иметь в виду, что изображение, которое мы видим на мониторе, одновременно находится в памяти видеодаптера.

Прямая работа с видеопамятью

В текстовом режиме для вывода изображений отводится область памяти с с абсолютного адреса B800h:0000h
по B800h:FFFFh. Все, что копируется в эту область автоматически пересылается в память видеоадаптера. При копировании необходимо иметь в виду, что для кодирования символа исрользуется два байта: байт с ASCII-кодом символа и байт с его атрибутом. При этом адресу B800h:0000h находится байт с кодом символа, расположенном в верхнем левом углу экрана; по адресу B800h:0001h лежит атрибут этого символа и т.д.

Для пересылки данных необходимо просто использовать функции пересылки данных без использования специальных функций MS-DOS или BIOS. Приведем описание некоторых необходимых функций.

Префиксы повторения операций:

  • REP — повторять;
  • REPE — повторять пока равно;
  • REPNE — повторять пока не равно;
  • REPZ — повторять пока ZF=0;
  • REPNZ — повторять пока ZF=1.

Префиксы указывает количество выполнений команд строковой обработки. Количество выполнений указывается в регистре ЕСХ (или СХ, в зависимости от разрядности). После каждого выполнения команды значение в регистре уменьшается на 1.
При этом REPZ и REPE прекращают выполнени команды, если ZF=0, а префиксы REPNZ и REPNE завершают выполнение, если ZF=1. Префикс REP обычно применяется с командами INS, OUTS, MOVS, LODS, STOS, а префиксы REPE, REPNE, REPZ и REPNZ применяются с командами CMPS и SCAS. Префиксов предназначены только с командами строковой обработки.

Операции копирования из регистров в память (в скобках указан тип процессора):

  • STOS приемник (8086) — запись в строку;
  • STOSB (8086) — запись байта в строку;
  • STOSW (8086) — запись слова в строку;
  • STOSD (80386) — запись двойного слова в строку.

Данные команды записывают значения регистров AL (STOSB), AX (STOSW) или ЕАХ (STOSD) в память, начиная с ES:EDI (или ES:DI в зависимости от разрядности). При использовании команды STOS ассемблер сам определяет по типу операнда форму этой команды (STOSB, STOSW или STOSD). После выполнения команды значение в регистре EDI (DI) увеличивается на 1, 2 или 4 (значения соответствуют байту, слову или двойному слову), если флаг DF = 0, и уменьшается, если DF = 1.

При использовании с префиксом REP команда STOS выведет строку длиной в ЕСХ (или СХ) числом, находящимся в аккумуляторе.

Приведем простой пример на NASM, выводящий 10 раз число 67, используя прямой вывод на экран.

org     100h          ; начало СОМ-файла
start:
	mov	ax,0003h
	int	10h  

	mov	cx,10
        mov     ax,0B800h ; сегментный адрес видеопамяти
        mov     es,ax
	mov     di,150		;
	mov	eax, 1f371f36h
	rep        stosd
        ret

При копировании данных в видеопамять необходимо учесть, что в архитектуре Intel при записи данных в память старший байт копируется по старшему адресу, т.е. при копировании  в память двойного слова 1f37h1f36h сначала копируется младший байт 36h (ASCII-код цифры 6), потом атрибут 1Fh.

Задание

Выведите, используя прямой вывод, на экран «рожицу».

При подготовке материала использована книга С.В.Зубкова «Assembler. Язык неограниченных возможностей».

Все лабораторные задания

Поделиться:
  • Добавить ВКонтакте заметку об этой странице
  • Мой Мир
  • Facebook
  • Twitter
  • LiveJournal
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • StumbleUpon
  • Technorati
  • БобрДобр
  • Memori.ru
  • МоёМесто.ru

Один комментарий к “Прямая работа с видеопамятью”

  1. Поясните, пожалуйста, этот тезис:
    При копировании данных в видеопамять необходимо учесть, что в архитектуре Intel …
    Вообще не понятно

Комментарии закрыты.