Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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




 

Все, что изображено на мониторе — и графика, и текст, одновременно присутствует в памяти, встроенной в видеоадаптер. Для того чтобы изображение появилось на мониторе, оно должно быть записано в память видеоадаптера. Для этого отводится специальная область памяти, начинающаяся с абсолютного адреса B800h:0000h (для текстовых режимов) и заканчивающаяся на B800h:FFFFh. Все, что программы пишут в эту область памяти, немедленно пересылается в память видеоадаптера. В текстовых режимах для хранения каждого изображенного символа используются два байта: байт с ASCII-кодом символа и байт с его атрибутом, так что по адресу B800h:0000h лежит байт с кодом символа, находящимся в верхнем левом углу экрана; по адресу B800h:0001h лежит атрибут этого символа; по адресу B800h:0002h лежит код второго символа в верхней строке экрана и т.д.

Таким образом, любая программа может вывести текст на экран простой командой пересылки данных, не прибегая ни к каким специальным функциям DOS или BIOS.

 

; dirout.asm; Выводит на экран все ASCII-символы без исключения,; используя прямой вывод на экран.model tiny.code.386; будет использоваться регистр ЕАХ; и команда STOSD org 100h; начало СОМ-файлаstart: mov ax,0003h int 10h; видеорежим 3 (очистка экрана) cld; обработка строк в прямом направлении; подготовка данных для вывода на экран mov еах,1F201F00h; первый символ 00 с атрибутом 1Fh,; затем пробел (20h) с атрибутом 1Fh mov bx,0F20h; пробел с атрибутом 0Fh mov cx,255; число символов минус 1 mov di,offset ctable; ES:DI - начало таблицыcloop: stosd; записать символ и пробел в таблицу ctable inc al; AL содержит следующий символ test cx,0Fh; если СХ не кратен 16, jnz continue_loop; продолжить цикл, push cx; иначе: сохранить значение счетчика mov cx,80-32; число оставшихся до конца строки символов xchg ax,bx rep stosw; заполнить остаток строки пробелами; с атрибутом 0F xchg bx.ax; восстановить значение ЕАХ pop cx; восстановить значение счетчикаcontinue_loop: loop cloop stosd; записать последний (256-й) символ и пробел; собственно вывод на экран mov ax,0B800h; сегментный адрес видеопамяти mov es,ax xor di,di; DI = 0, адрес начала видеопамяти в ES:DI mov si,offset ctable; адрес таблицы в DS:SI mov cx,15*80+32; 15 строк по 80 символов, последняя строка - 32 rep movsw; скопировать таблицу ctable в видеопамять ret; завершение СОМ-файлаctable:; Данные для вывода на экран начинаются сразу; за концом файла. В ЕХЕ-файле такие данные; определяют в сегменте.data? end start

 

При подготовке данных для копирования в видеопамять в этой программе использовался тот факт, что в архитектуре Intel при записи слова (или двойного слова) в память старший байт располагается по старшему адресу. Так что при записи в память двойного слова 1F201F00h сначала записывается самый младший байт 00h (ASCII-код текущего символа), потом 1Fh, используемый в этом примере атрибут, потом 20h (код пробела) и потом, по самому старшему адресу, — самый старший байт, 1Fh, атрибут для этого пробела. Кроме того, в этом примере использовались некоторые 32-битные команды (MOV и STOSD). Этими командами можно пользоваться из 16-битной программы (разумеется, если процессор 80386 и выше), но не стоит этим злоупотреблять, так как каждая такая команда оказывается длиннее на 1 байт и выполняется дольше на 1 такт.




Поделиться с друзьями:


Дата добавления: 2014-12-10; Просмотров: 758; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.