Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ассемблер. Учебное пособие

..pdf
Скачиваний:
184
Добавлен:
02.05.2014
Размер:
557.54 Кб
Скачать

Int 10H, функция 0DH, записать символ в позицию курсора Вызов: AH= 0Dh

BH= страница

CX= столбец (х-координата)

DX= строка (у-координата) Возврат: AL= значение пиксела

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

Int 21H, функция 02H, вывод символа Вызов: AH= 02h

DL= символ

Возврат: ничего не возвращается Выводит символ на активную видеостраницу.

Функцию 06h прерывания 21h можно также использовать для вывода символа на экран, ее описание приводится в разделе, посвященном работе с клавиатурой.

Int 21H, функция 09H, вывод строки на экран Вызов: AH= 09h

DS:DX= сегмент : адрес_строки Возврат: ничего не возвращается

Строка должна завершаться символом $ (24h), который не передается. Все другие коды, в том числе и управляющие, могут содержаться в выводимой строке. Часто в конце строки добавляют еще два управляющих символа: «возврат каретки» CR (0Dh) и «конец строки» LF(0Ah). Пример программного кода для вывода строки на экран приведен ниже.

CR EQU 0DH

LF EQU 0AH

MSG db ‘ПРИМЕР СТРОКИ’,CR,LF,’$’

........

 

mov

ah, 09H

mov

dx, SEG MSG

mov

ds, dx

mov

dx, OFFSET MSG

int

21H

63

Самое первое действие, которое необходимо выполнить при выводе изображения на дисплей – это очистить экран. Система предоставляет программисту несколько вариантов выполнения этой операции. Выбор зависит от того, что именно программа будет выполнять дальше и от аппаратуры ПК.

Первый вариант – это инициализация (установка) режима дисплея, но обычно этот метод используется только в самом начале программы, так как этот режим иногда приводит к неразберихе на экране при использовании адаптера (режима) CGA. При использовании функции 00h прерывания 10Н в каждую позицию экрана в текстовом режиме записывается пробел и для всего экрана устанавливается нормальный атрибут (7h).

Второй вариант – использование функций 6 или 7 прерывания 10Н, которые сдвигают экран. Преимуществом использования этих функций является то, что они позволяют очищать отдельные окна на экране.

Третий метод – использование функции 9 прерывания 10Н, которая способна вывести символ и атрибуты столько раз, сколько указано в регистре CX. Значение 2000 (режим 80*25) очистит весь экран, если курсор был установлен в 0,0. АL должен содержать символ пробела (ASCII 20H), BL – байт атрибутов, ВН – номер

страницы дисплея.

 

mov ah, 2

;установка курсора в 0,0

mov bh, 0

 

mov dx, 0

 

int

10H

 

mov ah, 9

; вывод пробела 2000 раз

mov cx, 2000

 

mov al, ’ ’

 

mov bl, 7

 

int

10H

 

Четвертым вариантом является прямая запись кода пробела и требуемого атрибута в область видеобуфера. Этот метод значительно ускоряет процедуру очистки и является более гибким, так как программист может очищать не только отдельные прямоугольные области экрана, но и более сложные по форме. Пример показывает вариант очистки всего экрана.

64

mov ax, 0B000h

mov es, ax

 

mov di, 0

; указатель на начало буфера

mov al, 32

; символ пробела в AL

mov ah,7

 

mov cx, 2000

 

REP stosw

; записываем содержимое AX в ES:DI 2000 раз

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

В зависимости от поставленной задачи позиционировать курсор можно двумя способами:

абсолютным позиционированием;

относительным позиционированием.

Абсолютное позиционирование представляет собой установку курсора относительно начала координат – верхнего левого угла дисплея. Для этого используют функцию 02h прерывания 10h с указанием новых координат курсора и номера страницы, вызов этой функции описан выше.

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

Для этого способа позиционирования курсора используют прерывание 10Н функцию 03h (получить позицию курсора), а после изменения координат функцию 02h для позиционирования в новом месте.

5.2. Динамика изображений

Ранее были рассмотрены примеры вывода статических изображений. Для того чтобы «анимировать» изображения, т.е. заставить их перемещаться по экрану, существует несколько способов. Алгоритм этих способов анимации подразумевает выполнение следующих шагов:

65

1.Вывести образ на экран (единичный символ или сложный объект);

2.Выдержать паузу;

3.Стереть образ;

4.Изменить координаты строки и столбца начала образа;

5.Повторить процесс с шага 1.

Различия этих способов заключаются в методах стирания образа. Для этих целей в программе можно использовать следующие алгоритмы:

вывести вместо символов образа пустые символы ASCII (пробелы);

вывести образ, присвоив его символам атрибут невидимости;

«псевдостирание» – вывести образ с новыми координатами

на другую видеостраницу, а затем сделать эту видеостраницу активной.

Использование какого-либо метода стирания из приведенных выше зависит от видеорежима и особенностей работы программы. Так вывод символа в активную страницу для цветных режимов адаптера приводит к нежелательному мерцанию экрана, поэтому для таких режимов чаще использую третий алгоритм с чередованием страниц.

Для вывода символов при решении задачи анимации объектов чаще всего используются 9Н и 0АН функции прерывания 10Н, вызов и особенности функционирования которых описаны выше. При анимации образов, состоящих из нескольких символов с разными атрибутами, чаще всего формируют массив символов составляющих образ, а при необходимости – массив символов с их атрибутами. Простым примером такого образа может служить строка, поэтому ниже приведем пример вывода строки через буфер.

STR db ‘Example string $’

mov ax, 0b000h mov es, ax

lea bx, str

mov di, POS_CURS

NEXT: mov al, [bx] cmp al, ‘$’ je QUIT

; сегмент видеобуфера

;начало строки ;ранее вычисленная позиция ;курсора в буфере

;элемент строки

;конец строки?

66

mov

es:[di], al

; вывод в видеобуфер

inc

di

 

inc

di

; перевод курсора

inc

bx

; следующий элемент строки

jmp

NEXT

 

QUIT: ………

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

5.3. Библиотека макроопределений

;установка курсора в абсолютную позицию экрана ; с координатами (х, у)

SetCursorPos MACRO X,Y mov ah,2

sub bh,bh mov dh,Y mov dl,X int 10h ENDM

ClearScreen MACRO ; очистка экрана функция 06h Int 10h mov ax,0600h

sub bh,bh sub cx,cx mov dx,184Fh int 10h ENDM

WriteCharAttrBIOS MACRO Char,Number,Attr ;несколько ; mov al,Char ; символов в текущую позицию mov cx,Number

67

sub

bh,bh

 

 

IFB <Attr>

; с атрибутом или без

mov ah,9

 

 

mov bl,Attr

 

 

ELSE

 

 

mov ah,0Ah

 

 

ENDIF

 

 

int

10h

 

 

ENDM

 

 

WriteCharTTY MACRO Char

; вывод символов с

mov ah,0Eh

 

; обработкой

mov al,Char

 

; кодов CR, LF, BEL

int

10h

 

 

ENDM

WriteBlockBIOS MACRO Adr, Lengh, Attr,X,Y ; вывод блока

mov ax,1300h

; символов

mov bl,Attr

; с заданным атрибутом

sub bh,bh

 

 

mov dh,Y

 

 

mov dl,X

 

 

mov cx,Lengh

 

 

push ds

 

 

pop es

 

 

push bp

 

 

mov bp,Adr

 

 

int 10h

 

 

pop bp

 

 

ENDM

 

 

WriteCharDOS MACRO Char

; вывод символа в

mov ah,6

 

; текущую позицию

mov dl,Char

 

 

int 21h ENDM

WriteStringDOS MACRO Adr; вывод строки на экран

mov ah,9

; строка должна

mov dx,Adr

; заканчиваться ‘$’

68

int

21h

 

ENDM

 

WriteBlockDOS MACRO Adr,Lengh

;вывод блока заданной

mov ah,40h

;длины

mov bx,1

 

mov cx,Lengh

 

mov dx,Adr

 

int

21h

 

ENDM

Список литературы

1.Гук М. Аппаратные средства PC: Энциклопедия. - СПб.:

Питер,2001. – 928 с.

2.Гук М. Процессоры Intel: от 8086 до Pentium II. - СПб.: Питер, 1998. – 456 с.

3.Данкан Р. Профессиональная работа в MS-DOS: Пер. с англ. –

М.: Мир, 1993. – 609 с.

4.Корнеев В.В., Киселев А.В. Современные микропроцессоры. -

СПб.: BHV-CПб , 2003 – 448 с.

5. Рембольд У. Введение в информатику/ Пер. с нем. –

Уфа: УГАТУ, 1996. – 446 с.

6.Рудометов Е.А., Рудометов В.Е. Материнские платы и чипсеты. - СПб.: Питер, 2000 – 256 с.

7.Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера: Пер. с англ. – М.: Радио и связь, 1991. – 336 с.

8.Управление роботами. Основы управления

манипуляционными роботами:

Учебник

для

вузов/

С.Л. Зенкевич, А.С. Ющенко.

- М.:

Изд-во

МГТУ

им. Н.Э.Баумана, 2000. – 400 с.

 

 

 

9.Фу К., Гонсалес Р., Ли К. Робототехника: Пер. с англ. – М.:

Мир, 1989, – 624 с.

10.Хмельницкий С.В. Архитектура персональных ЭВМ типа IBM PC: Учебное пособие. СПб.: СПбГААП, 1995. – 386 с.

11.htttp://www.assembler.ru

69