Все, что изображено на мониторе – и графика, и текст, одновременно присутствует в памяти, встроенной в видеоадаптер. Чтобы изображение появилось на мониторе, оно должно быть записано в память видеоадаптера. Для этой цели отводится специальная область памяти, начинающаяся с абсолютного адреса 0В800h:0000h (для текстовых режимов) и заканчивающаяся 0В800h:0FFFFh. Все, что программы пишут в эти область памяти, немедленно пересылается в память видеоадаптера. В текстовых режимах для хранения каждого изображенного символа используются два байта: байт с ASCII кодом символа и байт с его атрибутом, так что по адресу 0В800h:0000h лежит байт с кодом символа, находящегося в верхнем левом углу экрана; по адресу 0В800h:0001h расположен атрибут этого символа; по адресу 0В800h:0002h – код второго символа в верхней строке экрана и т.д. Таким образом, любая программа может вывести текст на экран простой командой пересылки данных, не прибегая ни к каким специальным функциями DOS или BIOS.
;dirout.asm
;Выводит на экран все ASCII-символы без исключения, используя ;прямой вывод на экран.
;
.model tiny
.code
.386 ;Будет использоваться регистр ЕАХ
;и команда STOSD
org 100h ;Начало com-файла
start:
mov ax, 0003h
int 10h ;Видеорежим 3 (очистка экрана).
cld ;Обработка сток в прямом направлении
;Подготовка данных для вывода на экран:
mov eax, 1F201F00h;первый символ 00 с атрибутом 1Fh.
;затем пробел (20h) c атрибутом 1Fh
mov bx, 0F20h ;Пробел с атрибутом 0Fh
mov cx, 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, 6 ;15 строк по 80 символов, последняя строка-32.
rep movsw ;Скопировать таблицу ctable в ;видеопамять.
ret ;Завершение com-файла.
end start
Варианты заданий:
1. Вывести на экран с помощью видеопамяти 1-10 символы ASCII-таблицы.
2. Вывести на экран с помощью видеопамяти 10-20 символы ASCII-таблицы.
3. Вывести на экран слово «Привет», красными буквами на синем фоне.
4. Вывести на экран с помощью видеопамяти 20-30 символы ASCII-таблицы.