Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки ассемблеру. Быстро и просто. Урок 12


Довольно короткий урок. Давайте мы расскажем вам, друзья, о прямом отображении символов в видеобуфер.

;Всё, что следует за значком ";" - это комментарий.

.286 ;Разрешает ассемблирование непривилегированных инструкций
;процессора 80286 (реальный режим) и инструкций арифметического
;сопроцессора 80287.

CSEG segment ;Даём имя сегменту, а точнее определяем абсолютный
;сегмент в памяти программ по определённому адресу.
;Имя нашего сегмента будет CSEG.

assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG ;Задаём сегментные регистры, которые будем использовать для
;вычисления действующего адреса для всех меток и переменных, опре-
;делённых для сегмента или группы сегментов с указанным именем.
;У нас их четыре, - CS, DS, ES, SS и они будут указывать на наш
;единственный сегмент (мы его назвали CSEG).

org 100h ;Устанавливаем счётчик инструкций в текущем сегменте в соот-
;ветствии с адресом, задаваемым "выражением".
;Сейчас этот счётчик равен 100h - используется для всех программ
;типа .com

begin: ;Метка начала программы.



mov ax,0003h ;Устанавливаем текстовый видеорежим - 80х25 символов.
int 10h

mov ax,0B800h
mov es,ax ;Сегмент тестовой видеопамяти пересылается в ES.
mov di,0

mov ah,31 ;AH - аттрибут текста (цвет - фон).
mov al,3 ;AL - код символа для вывода ("сердечко").
mov es:[di],ax ;Выводим на экран аттрибут символа и сам символ.

mov ah,10h ;Ждём нажатия кнопки.
int 16h

mov ah,4Ch ;Используем для выхода из программы.
int 21h

CSEG ends ;Указываем на завершение сегмента CSEG.
end begin ;Конец программы.

ml test.asm /AT

Внимания заслуживают две строчки:

mov ax,0B800h (и следующая mov es,ax) — установка адреса сегмента видеопамяти, он начинается с адреса 0B800h.
mov es:[di],ax — запись в видеобуфер значения, находящегося в ax. В этот момент значение ax равно 1F03h (то, что мы и занесли), es равен 0B800h (начало адреса сегмента видеопамяти), а di равен 0. Мы можем поместить символ и в следующую позицию, однако di будет равен 2 (потому что символ занимает два байта - сам символ и его атрибут. Мы его и помещаем в ax).

И вот ещё что — внимание! Квадратные скобки [ ] указывают на то, что надо загрузить число не в регистр, а по адресу, который содержится в этом регистре (т.е. 0B800h:0000h). Кроме того, отметьте, что для прямого отображения в видеобуфер рекомендуется использовать сегментный регистр ES.

Ну как, отдохнули? Следующий урок будет сложным — в нём мы научимся оставлять нашу программу в памяти и перехватывать прерывания из других программ.


В избранное