|
Ассемблер в примерах - Работа с видеобуфером
- Вопрос:
- В книге Калашникова в главе 3 есть программа для практики, которая должна отображать символ (01 - рожица в ASCII кодах) ярко-белым цветом на синем фоне. К сожалению у меня она не отразилась, хотя com-файл был создан. Я добавил (по наитию) очистку экрана. Рожица отразилась, но грязно белая на черном экране. Хотелось бы получить обещанное. На всякий случай в приложение помещаю код программы.
CSEG segment
org 100h
beg:
;очистка экрана (моя добавка)
mov ax,3
int 10h
;опять Калашников
mov ax,0b800h;если можно, назначение этой функции. У Калашникова есть объяснение, но я не понял
mov es,ax
mov di,0;кстати, что это за регистр. Уже третий раз без объяснений
mov ah,31;цвета
mov al,1;рожица
mov es:[di],ax
mov ah,10h
int 16h
int 20h
CSEG ends
end beg
- Ответ:
- До этого момента Вы работали только в одном сегменте памяти размером 64кб. Все сегментные регистры имели одинаковое значение. Данный пример демонстрирует работу с сегментами, а именно прямую запись в видеобуфер с помощью индексного регистра DI.
В реальном режиме работы процессора доступны 16-ть сегментов по 64кб, т.е. 1 мб. Любой физический адрес вычисляется как сумма сегментного регистра(CS,DS,ES,SS) и регистра общего назначения (AX,BX,CX,DX,DI,SI,BP,SP). У каждого регистра общего назначения есть дополнительная функция возложенная на него разработчиками.
К примеру:
AX - аккумулятор, в нем производятся основные арифметические вычисления, команды использующие этот регистр имеют более которкий код и выполняются быстрее;
BX - базовый регистр, очень полезен при работе с массивами, может применятся с регистрами DI и SI([ BX + DI ]);
CX - счетчик, используется в оператора цикла и некотороых строковых командах;
DX - регистр данных, в некоторых командах используется как разширитель аккумулятора, если результат работы превышает размер 16-ть бит;
DI - индекс приемника;
SI - индекс источника;
Два последних регистра используются в строковых командах.
Все выше перечисленные регистры по умолчанию используются вместе с регистром DS;
BP - база стека, может применятся с регистрами DI и SI([ BP + SI ]);
SP - указатель стека;
Эти два регистра по умолчанию работают только с регистром SS.
Установленные по умолчанию регистры можно измеять, так как это сделано в приведенном Вами примере mov es:[di],ax, т.е. записать слово по адресу определенному в регистрах ES:DI. Вся физическая память реального режима разбита на области:
00000-А0000 - рабочая и служебная область DOS;
А0000-С0000 - буфер видеопамяти;
С0000-FFFFF - служебная область BIOS.
В контексте Вашего вопроса: область видеопамяти используется видеоконтролером для хранения отображаемой информации. Для каждого видеорежима установленны свои адреса. Сегментный адрес 0b800h используется в режимах 00-06. Смещение относительно начала сегмента в памяти соответствует отображаемому символу на экране. В данном примере DI=0 т.е. верхний-левый угол.
К примеру если Вы запишите mov di,100, то у отображаемый символ сместится. Проверьте.
Также Вы можете по эксперементировать и с сегментным регистром, к примеру:
mov ax,0b000h
mov es,ax
mov di,8000h.
При получении физического адреса сегментный регистр умножается на 16-ть и складывается с индексным регистром, т.е. получается 0b8000+00000 это равно 0b0000+08000. Для программиста такая процедура получения адреса прозрачна, т.к. это всё реализованно на аппаратном уровне.
Для установленого Вами режима на каждый символ отводится два байта: сам ASCII-код и его аттрибут.
На нем и остановимся: биты 0-3 определяют цвет символа, биты 4-6 определяют цвет фона, бит 7 - яркость.
Цвета располагаются в таком порядке (00=черный, темно-синий, темно-зеленый, бирюзовый, темно-красный, темно-коричневый, коричневый и 07=серый)- для фона и текста, дальше только для текста(08=темно-cерый, синий, зеленый, голубой, красный, фиолетовый, желтый и 15=белый). Попробуйте менять аттрибуты в строке mov ah,31.
Строками:
mov ax,3
int 10h
Вы переводите видеоконтролер в 3-й текстовый видеорежим. Это нужно делать во всех DOS-примерах(из учебника) запускаемых под ХР. Если страший бит регистра AL установить в 1, то очистки экрана не будет: mov ax,83h.
О видах адресации советую почитать С. Зубкова, о работе с видеоконтролерами - В. Кулакова. Эти книги Вам пригодятся в дальнейшем.
| |