Поиск по сайту:
Новая таблица умножения - Статья.
MSDN по русски. Описание классов С++ - Статья.
Стандарты MPEG - Статья.
MSDN по русски. Описание классов и функций Visual C++ .NET - Статья.
В данном приложении приведены два листинга программ, самостоятельное прочтение которых поможет составлению собственных программ к данной работе.
Листинг 2.3. Программа осуществляет ввод строки с произвольными ASCII-символами с последующим преобразованием строчных символов в прописные. Программа может быть дополнительно использована для изучения поведения универсальных функций ввода-вывода строковых переменных DOS (38h и 40h) при переназначении ввода-вывода данных.
IDEAL
MODEL small
STACK 256
;Макроопределения
descrip_in = 0 ;Дескриптор стандартного ввода
descrip_out = 1 ;Дескриптор стандартного вывода
descrip_err = 2 ;Дескриптор стандартной ошибки (экрана)
DATASEG
msg Db 'Введите строку!'
msg_len = $-msg
Buf DB 80 DUP(?)
actual_len DW ?
CODESEG
Start: mov ax,@data ;Установка в ds адреса
mov ds,ax ;сегмента данных
;Вывод служебного сообщения msg
mov ah,40h ;Функция вывода
mov bx,descrip_err
mov cx,msg_len ;Длина сообщения
mov dx,offset msg ;Адрес сообщения
int 21h
;Ввод строки с клавиатуры в буфер Buf
mov ah,3fh ;Функция ввода
mov bx,descrip_in
mov cx,80 ;Ввод максимум 80 байт
mov dx,offset Buf ;Адрес буфера
int 21h
mov [actual_len],ax ;Фактически введено
;Преобразование строчных латинских букв в прописные
mov cx,[actual_len] ;Счётчик элементов строки
mov si,0 ;Инициализация указателя элементов строки
filter: mov al,[Buf+si] ;Возьмём символ
cmp al,'a' ;Меньше 'a'?
jb no_letter ;Да, не преобразовывать
cmp al,'z' ;Больше 'z'?
ja no_letter ;Да, не преобразовывать
sub al,20h ;Преобразуем в прописную
mov[Buf+si],al ;Отправим в Buf
no_letter: inc si
loop filter ;Цикл
;Вывод на экран
mov ah,40h ;Функция вывода
mov bx,descrip_out
mov cx,[actual_len] ;Длина сообщения
mov dx,offset Buf ;Адрес сообщения
int 21h
Exit: mov ax,4C00h ;Функция DOS 4Сh: выход из программы
int 21h ;Вызов DOS. Останов
END Start ;Конец программы/точка входа
Листинг 2.4. Программа выполняет вставку одной строки в другую с произвольной позиции первой. Номер позиции по запросу программы задаётся с клавиатуры одной десятичной цифрой (ограниченное значение номера позиции объясняется преждевременностью решения вопроса преобразования ASCII-числа в двоичное число). Программа снабжена подробными комментариями, помогающими усвоить основные подходы в построении подобных программных продуктов. Помимо функций DOS в программе используется операция очистки экрана с помощью функции BIOS. Рассмотрению функций BIOS посвящена следующая лабораторная работа.
IDEAL
MODEL small
STACK 256
DATASEG
mes1 DB 13,10,'Введите первую и вторую строки',13,10,'$'
mes2 DB 'Введите номер позиции N $'
N DW ?
Buf1 DB 50,?,50 DUP(?)
Buf2 DB 20,?,20 DUP(?)
Buf3 DB 80 DUP(?)
len_str1 DW 0
len_str2 DW 0
CODESEG
Start: mov ax,@data ;Установка в ds адреса
mov ds,ax ;сегмента данных
mov es,ax
call screen ;Очистка экрана с установкой курсора в левый верхний угол
;Вывод запроса mes1
mov ah,09h ;Функция вывода
mov dx,offset mes1 ;Адрес сообщения mes1
int 21h ;Вызов DOS
;Последовательный ввод первой и второй строк функцией 0Ah (с эхом) в буферы Buf1 и Buf2
;соответственно. Нулевой элемент – заявленный пользователем максимальный размер буфе-
;ра, первый- число действительно введённых байтов, второй- первый введённый элемент строки и т. д.
mov dx,offset Buf1 ;Адрес буфера ввода для строки_1
mov ah,0Ah
int 21h ;Вызов DOS
mov cl,[Buf1+1] ;Число элементов строки_1
mov [byte len_str1],cl ;Сохраним
call CR_LF ;Перевод курсора на новую строку
mov ah,0Ah
mov dx,offset Buf2 ;Адрес буфера ввода для строки_2
int 21h
mov cl,[Buf2+1] ;Число элементов строки_2
mov [byte len_str2],cl ;Сохраним
call CR_LF
;Вывод запроса mes2 и ввод номера позиции N (десятичная цифра)
mov ah,09h
mov dx,offset mes2 ;Адрес сообщения mes2
int 21h ;Вызов DOS
mov ah,01h ;Функция ввода одиночного символа
int 21h ;Вызов DOS
sub al,30h ;Преобразование ASCII- символа числа в
mov [byte N],al ;двоичное число и его сохранение
call CR_LF
;Перезапись элементов 1-й части строки_1, т.е. элементов с индексами 0...N, в Buf3.
mov si,offset Buf1+2 ;DS:SI- адрес строки_1
mov di,offset Buf3 ;ES:DI- адрес объединённой строки_3, ;совпадающий с адресом Buf3
cld ;DF=0- просмотр вперёд
mov cx,[N]
inc cx ;Число пересылаемых элементов
rep movsb ;Переслать 1-ую часть строки_1 в буфер Buf3
mov bx,si ;Сохраним адрес этого элемента строки_1
;Перезапись строки_2 в Buf3 с позиции N
mov si,offset Buf2+2 ;DS:SI- адрес строки_2
mov cx,[len_str2] ;Число пересылаемых элементов строки_2
rep movsb ;Добавить строку_2 к первой части строки_1 в Buf3
;Перезапись 2-й части строки_1 в Buf3 (число оставшихся элементов: len_str1-N-1)
mov si,bx ;Восстановим адрес источника
mov cx,[len_str1]
sub cx,[N]
dec cx ;Число элементов оставшейся части строки_1
rep movsb ;Переписать
;Подсчёт числа элементов объединённой строки и вывод её на экран
mov cx,[len_str1]
add cx,[len_str2] ;Число элементов объединённой строки_3
mov ah,40h ;Функция вывода
mov dx,offset Buf3 ;Адрес строки_3
mov bx,1 ;Дескриптор экрана
int 21h ;Вызов DOS
Exit: mov ax,4C00h ;Функция DOS 4Сh:выход из программы
int 21h ;Вызов DOS. Останов
;Процедура очистки экрана и установки курсора в левый верхний угол
PROC screen
mov ah,06 ;Функция инициализации окна или его скроллинг
mov al,0 ;Очистка
mov bh,0Fh ;Атрибут: Ярко-белый по чёрному
mov cx,0 ;Левый верхний угол
mov dx,184Fh ;Правый нижний угол
int 10h
mov ah,02 ;Функция установки позиции курсора
mov bh,0 ;Номер видеостраницы
mov dx,0 ;Координаты курсора (y=00, x=00)
int 10h
ret
ENDP screen
;Процедура перевода курсора на новую строку функцией 02h
PROC CR_LF
push ax
push dx
mov ah,02h ;Функция вывода одиночного элемента
mov dl,13 ;CR=13-возврат каретки
int 21h ;Вызов DOS
mov dl,10 ;LF=10-перевод на новую строку
int 21h
pop dx
pop ax
ret
ENDP CR_LF
END Start ;Конец программы/точка входа
Esc-последовательности [4, 12] вводятся программой-драйвером Ansi.sys, входящей в состав DOS, и дают пользователю дополнительные возможности управления экраном в сравнении с существующими функциями DOS. Этот драйвер не предоставляет никаких добавочных возможностей, которые нельзя было бы добиться с помощью функций BIOS, однако он делает управление выводом на экран более простым, но, к сожалению, и более медленным. Если в символьной строке, выводимой на экран, встречается код клавиши <Exc> (27 = = 1Bh), за которым следует символ [(91 = 5Bh), то Ansi–драйвер перехватывает последующие символы и интерпретирует их как команды управления экраном или клавиатурой.
С помощью Esc-последовательностей можно очищать экран, перемещать по нему курсор, выбирать цвет фона и символа, изменять видеорежим, а также переопределять клавиши клавиатуры. В основномEsc-последовательности используются для формирования цветных информационных кадров. Перечень основных Esc-последовательностей с кратким комментарием сведён в табл. П.2.1 (Ansi-драйвер чувствителен к регистру клавиатуры, на котором вводится завершающая Esc-последовательность буква). Для вывода Esc-последователь-ностей на экран используются обычно функции DOS 09h и 40h (можно использовать и соответствующие средства языков высокого уровня, которые выдают символы на консоль).
Таблица П.2.1
Esc-последовательности для управления экраном и клавиатурой
Последовательность |
Действие |
Esc[2J |
Очистка экрана и перемещение курсора в левый верхний угол |
Esc[K |
Очистка конца строки от позиции курсора |
Esc[s |
Сохранение текущих координат курсора в специальном буфере |
Esc[u |
Восстановление сохранённых в буфере координат курсора |
Esc[стр;позН |
Установка позиции курсора. Параметр стр обозначает Y-коорди-нату курсора в пределах 1 – 25, параметр поз – Х – координату Пример: Esc[12;32Н – установка курсора на 32-й столбец 12-й строки |
Esc[кодА |
Перемещение курсора на код строк вверх |
Esc[кодВ |
Перемещение курсора на код строк вниз |
Esc[кодС |
Перемещение курсора на код позиции вправо |
Esc[кодD |
Перемещение курсора на код позиции влево |
Esc[=7h |
Автоматический перевод курсора на следующую строку |
Esc[=7l |
Выключение предыдущего действия |
Esc[код_1;код_2;код_3 m |
Выбор атрибутов символов. Возможные значения параметра кодприведены в табл. П.2.2. Порядок следования – произвольный. Примеры: Esc[0m – отмена цвета или возврат к чёрно-белому изображению Esc[31;47m – установка цвета (красные символы по белому полю) Esc[5;34;47m – синие мерцающие символы на белом фоне |
Esc[=mh |
Выбор видеорежима m. Пример: Esc[=3h – 16 -цветный текстовый, 80х25 (режим 3) |
Параметры Esc-последовательности приведены в табл. П.2.2.
Ниже приведена программа, иллюстрирующая использование Esc-последовательностей. Программа выводит в середину пустого экрана текст в рамке.
Таблица П.2.2
Параметры Esc-последовательности
Код |
Назначение |
||
0 |
Нормальное изображение (чёрные символы на белом фоне) |
||
1 |
Выделение яркостью |
||
4 |
Включено подчёркивание |
||
5 |
Выделение мерцанием |
||
7 |
Инверсное изображение (белые символы на чёрном фоне) |
||
8 |
Всё включено, символы невидимы (скрытый текст) |
||
Код символа |
Назначение |
Код фона |
Назначение |
30 |
Чёрные |
40 |
Чёрный фон |
31 |
Красные |
41 |
Красный фон |
32 |
Зелёные |
42 |
Зелёный фон |
33 |
Жёлтые |
43 |
Жёлтый фон |
34 |
Синие |
44 |
Синий фон |
35 |
Фиолетовые |
45 |
Фиолетовый фон |
36 |
Бирюзовые (голубые) |
46 |
Бирюзовый (голубой) фон |
37 |
Белые |
47 |
Белый фон |
Листинг 2.5. Демонстрация_1 Esc-последовательности
Ideal
Model small
Stack 256
Dataseg
;Сообщение, оконтуренное рамкой
mes db 27,'[2J',27,'[5;31;46m' ;Очистка экрана и задание цвета (красные на
;бирюзовом фоне)
db 27,'[12;30H',0C9h,22 dup (0CDh),0BBh ;Позиционирование (строка, столбец) и
;символы
db 27,'[13;30H',0BAh,'ESC-последовательности',0BAh ;Позиционирование и символы
db 27,'[14;30H',0C8h,22 dup (0CDh),0BCh ;Позиционирование и символы
db 27,'[0m',27,'[01;01H','$' ;Отмена цвета и позиционирование
Codeseg
Start: mov ax,@data ;Установка в ds адреса
mov ds,ax ;сегмента данных
mov ah,09h ;Функция вывода
mov dx,offset mes
int 21h
Exit: mov ax,04C00h ;Функция DOS 4Сh:выход из программы
int 21h ;Вызов DOS. Останов
End Start ;Конец программы/точка входа
Как известно, кроме обычных символов и других знаков, имеющихся на клавиатуре, на экран можно выводить символы псевдографики, которым соответствуют коды от 0B0h до 0DFh. В приведённой выше программе для формирования двойной рамки используются следующие коды:
║ 0BAh ╗ 0BBh ╝ 0BCh ╚ 0C8h ╔ 0C9h ═ 0CDh
Можно предложить и другой способ использования ESC-последовательностей при выводе на экран сообщений функцией 09h int 21h с использованием атрибутов цвета для фона и символов. Данный способ иллюстрируется следующим фрагментом программы.
Листинг 2.6. Демонстрация_2 Esc-последовательности
Macro outstr message ;макрос вывода строки
mov ah,09h
mov dx,offset message
int 21h
Endm outstr
DATASEG
mes1 db 'Афанасьев В.А.',10,13,'$'
mes2 db '*** Кафедра ВТ ***$'
red_blue db 27,'[31;44m$' ;Задание атрибутов цвета "Красный по синему"
;для изображения текста на экране, выводимого с помощью функции 09h int 21h
green_white db 27,'[32;47m$' ;"Зелёный по белому"
cancel db 27,'[0m$' ;Восстановление атрибутов цвета по умолчанию
CODESEG
Start: mov ax,@data ;Установка в ds адреса
mov ds,ax ;сегмента данных
outstr red_blue ;Установка атрибутов цвета
outstr mes1 ;Вывод сообщения mes1
outstr green_white ;Установка атрибутов цвета
outstr mes2 ;Вывод сообщения mes2
outstr cancel ;Восстановление атрибутов цвета
....
Назначения атрибутов цвета будут действовать на все последующие команды вывода (включая функции BIOS прерывания 10h) до тех пор, пока не будут сделаны другие назначения.
В данном приложении приведена полная таблица отображаемых символов ASCII, состоящая из двух равных частей по 128 символов. Номера строк соответствуют первой цифре 16-теричного кода символа, номера столбцов – второй, так что, например, код прописной латинской буквы А = 41h. Первая половина таблицы символов с кодами 00h – 7Fh является Американским стандартным кодом для обмена информации (английская аббревиатура ASCII) и имеет международный стандарт, вторая – соответствует одному из широко распространённых в России вариантов кодирования символов для IBM-совместимых компьютеров.
Первая половина таблицы ASCII содержит символы двух типов: управляющие (коды 00h – 1Fh, 7F) и алфавитно-цифровые (20h-7E), вторая – символы кириллицы и псевдографики.
![]() |
Использование драйвера ANSY.SYS требует включения в файл Config.sys (Config.nt) строки:
Device=C:\Win98\Command\Ansy.sys
Или нечто аналогичное, определяющее полный путь к драйверу в вашем компьютере.