< Назад Далее > |
Представим себе, что мы создаем обучающую программу и нам понадобилось вывести на экран несколько строк из введения к этой книге. Соответствующая программа приведена в примере 7.1.
Пример 7.1. Вывод на экран информационного сообщения
text segment 'code' ; Начало сегмента команд assume CS:text, DS:data begin: mov AX,data ; Инициализация сегментного mov DS,AX ; регистра DS mov AH,9 ; Функция DOS вывода на экран mov DX,offset message ; Адрес выводимого сообщения int 21h ; Вызов DOS mov AX,4C00h ; Завершение программы int 21h text ends ; Конец сегмента команд data segment ; Начало сегмента данных message db 'Другую группу составляют различные аспекты реализации ' db 'в программах на языке ассемблера аппаратных и ' db 'системных возможностей персонального компьютера:' db '- программирование ввода-вывода;' db '- использование прерываний BIOS и функций DOS;' db '- программирование арифметического сопроцессора;' db '- работа в защищенном режиме;' db '- управление обычной и расширенной памятью.$' data ends ; Конец сегмента данных stk segment stack ; Начало сегмента стека dw 128 dup (0) ; Стек stk ends ; Конец сегмента стека end begin ; Конец текста программы
Заметим, что эта программа написана стандартным образом: в ней имеются сегменты команд, данных и стека. Так же будут составляться и программы последующих примеров этой книги.
Текст, предназначенный для вывода на экран, включен в программу в помощью директивы db (определить байт). Поскольку длина текста превышает ширину экрана, он разбит на участки, каждый из которых формально составляет отдельное предложение языка ассемблера. Заканчивается текст знаком $, характеризующим конец строки для функции DOS 09h.
Подготовив и выполнив эту программу, мы увидим, что весь текст вывелся на экран сплошной последовательностью символов без разбивки на строки и абзацы. Неприятно также и то, что наш текст вывелся на «грязный» экран с остатками предыдущих выводов. Для получения более удобочитаемого вывода в символьную строку следует включить коды управления курсором:
С очисткой экрана дело обстоит сложнее. Единственное, что пока можно сделать — это вывести на экран столько строк пробелов, чтобы, перемещаясь по мере вывода вверх по экрану, они очистили всю его верхнюю часть.
В примере 7.2 представлено описание модифицированной строки message (все остальные предложения программы не изменяются).
Пример 7.2. Вывод на экран форматированного текста
message db 80 * 18 dup (' ') db 9, 'Другую группу составляют различные аспекты реализации в' db ' программах на', 10, 13, 'языке ассемблера аппаратных и' db ' системных возможностей персонального компьютера:', 10, 13 db 9, '- программирование ввода-вывода;', 10, 13 db 9, '- использование прерываний BIOS и функций DOS;', 10, 13 db 9, '- программирование арифметического сопроцессора;', 10, 13 db 9, '- работа в защищенном режиме;', 10, 13 db 9, '- управление обычной и расширенной памятью.$'
Пробелы (18 строк по 80 пробелов в строке) описаны с помощью оператора dup (duplicate, дублировать). Перед словом dup указывается коэффициент повторения (в котором можно использовать арифметические выражения), а после оператора dup в скобках — повторяемая строка (состоящая не обязательно из одного символа). Коды табуляции создадут отступы красных строк. Чтобы текст выглядел на экране аккуратно, мы в середину первого абзаца включили коды 10 и 13 для перехода на следующую строку.
Кроме обычных алфавитно-цифровых символов и других знаков, имеющихся на клавиатуре компьютера (например, знаков < > [ ] { } | и др.) на экран можно выводить символы псевдографики. Таких символов всего 48; им соответствуют коды от 176 до 223. Так, например, для формирования на экране двойной рамки используются следующие коды:
Наконец, если в строку, выводимую на экран, включить код 7, прозвучит короткий звуковой сигнал.
В примере 7.3 приведена символьная строка, вывод которой с помощью функции 09h DOS приведет к выводу длительного звукового сигнала и изображению приблизительно в центре чистого экрана слова «Внимание!» в рамке.
Пример 7.3. Вывод на экран информационного кадра
message db 25 dup (7) db 80 * 12 dup (' ') db 35 dup (' '), 201, 9 dup (205), 187, 10, 13 db 35 dup (' '), 186, 'Внимание!', 186, 10, 13 db 35 dup (' '), 200, 9 dup (205), 188, 10, 13 db 10 * 80 dup (' '), '$'
В приведенных выше примерах некоторые символы вводились в программу в виде их изображений (букв), а другие — с помощью их кодов. В действительности все символы, отображаемые на экране терминала или выводимые на печать, имеют закрепленные за ними коды, которые называются кодами ASCII. Каждый код ASCII занимает один байт и может принимать значение от 0 до 255. Совокупность всех 255 кодов вместе с изображениями символов составляют кодовою таблицу ASCII (рис. 7.1).
Рис. 7.1. Кодовая таблица для нашей страны в десятичном представлении
Очевидно, что описывать в программе текстовые строки с помощью кодов ASCII по меньшей мере неудобно. В то же время для вывода на экран псевдографических изображений или других пиктограмм, для которых нет соответствующих клавиш, приходится пользоваться кодами ASCII. Однако иметь в виду соответствие символов и кодов ASCII приходится довольно часто. Например, упорядочивание символов или символьных строк по алфавиту фактически выполняется по кодам ASCII.