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

видеокартаМы уже рассмотрели вывод на экран при помощи средств 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. Язык неограниченных возможностей».

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

Если Вы обнаружили ошибку, пожалуйста, выделите ее и нажмите Shift + Enter или нажмите здесь для информирования меня.

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

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

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *