Поиск по сайту:


Смотри также:

MSDN по русски. Описание классов и функций Visual C++ .NET - Статья.

Компьютерная телефония - Статья.

Субтрактивные цветовые модели - Статья.

Самая... Самый... Самое... - Статья.

Все новинки...

Статья «Assembler IBM PC Приложения к лабораторной работе № 2»

Поделиться:

ПРИЛОЖЕНИЕ П.2.1. ПРИМЕРЫ РЕАЛИЗАЦИЙ ТИПОВОГО ЗАДАНИЯ

В данном приложении приведены два листинга программ, самостоятельное прочтение которых поможет составлению собственных программ к данной работе.

Листинг 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                          ;Конец программы/точка входа

ПРИЛОЖЕНИЕ П.2.2. ESC-ПОСЛЕДОВАТЕЛЬНОСТИ

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, параметр поз – Х – координату 
в пределах 1 – 80 (для видеорежима 80 х 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) до тех пор, пока не будут сделаны другие назначения.

ПРИЛОЖЕНИЕ П.2.3. ТАБЛИЦА СИМВОЛОВ В КОДИРОВКЕ ASCII

В данном приложении приведена полная таблица отображаемых символов 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

Или нечто аналогичное, определяющее полный путь к драйверу в вашем компьютере.