Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Питер Абель Весь текст 992.61 Kb

Ассемблер и программирование для IBM PC

Предыдущая страница Следующая страница
1 ... 16 17 18 19 20 21 22  23 24 25 26 27 28 29 ... 85
использовать одну команду MOV c непосредственным шест. значением:

               MOV  DX,050CH  ;Строка 5, столбец 12


     ОЧИСТКА ЭКРАНА
     ________________________________________________________________

     Запросы и  команды  остаются  на  экране  пока  не  будут  смещены  в
результате прокручивания  ("скроллинга")  или  переписаны на этом же месте
другими запросами или командами. Когда программа начинает cвое выполнение,
экран может быть очищен. Очищаемая область экрана может начинаться в любой
позиции  и  заканчиваться  в  любой  другой  позиции  с  большим  номером.
Начальное значение строки и столбца заносится в регистр DX,  значение 07 -
в регистр BH и 0600H в AX.  В следующем примере выполняется очистка  всего
экрана:

               MOV  AX,0600H  ;AH 06 (прокрутка)
                              ;AL 00 (весь экран)
               MOV  BH,07     ;Нормальный атрибут (черно/белый)
               MOV  CX,0000   ;Верхняя левая позиция
               MOV  DX,184FH  ;Нижняя правая позиция
               INT  10H       ;Передача управления в BIOS

     Значение 06 в регистре AH указывает команде  INT  10H  на  выполнение
операции очистки экрана. Эта операция очищает экран пробелами; в следующей
главе скроллинг (прокрутка) будет рассмотрен подробнее.  Если вы по ошибке
установили  нижнюю  правую  позицию  больше,  чем шест.  184F,  то очистка
перейдет вновь к началу  экрана  и  вторично  заполнит  некоторые  позиции
пробелами. Для    монохромных   экранов   это   не   вызывает   каких-либо
неприятностей,  но  для  некоторых  цветных  мониторов  могут   возникнуть
серьезные ошибки.


     ЭКРАННЫЕ И КЛАВИАТУРНЫЕ ОПЕРАЦИИ: БАЗОВАЯ ВЕРСИЯ DOS
     ________________________________________________________________

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


     ВЫВОД НА ЭКРАН: БАЗОВАЯ ВЕРСИЯ DOS
     ________________________________________________________________

     Вывод на экран в базовой версии DOS  требует  определения  текстового
сообщения в области данных, установки в регистре  AH  значения  09  (вызов
функции DOS)  и  указания  команды  DOS  INT  21H.  В  процессе выполнения
операции  конец  сообщения  определяется  по  oграничителю  ($),  как  это
показано ниже:

               NAMPRMP     DB   'Имя покупателя?','$'
                           .
                           .
                           MOV  AH,09          ;Запрос вывода на экран
                           LEA  DX,NAMPRMP     ;Загрузка адреса сообщ.
                           INT  21H            ;Вызов DOS

Знак ограничителя "$" можно кодировать  непосредственно  после  cимвольной
строки (как показано в примере), внутри строки: 'Имя покупателя?$', или  в
следующем операторе DB '$'.  Используя данную операцию, нельзя вывести  на
экран  символ  доллара  "$".  Кроме  того,  если  знак    доллара    будет
отсутствовать в конце строки, то на экран будут выводиться все последующие
символы, пока знак "$" не встретиться в памяти.
     Команда LEA загружает адрес области NAMPRMP в регистр DX для передачи
в DOS адреса выводимой информации. Адрес поля NAMPRMP, загружаемый в DX по
команде LEA, является oтносительным, поэтому  для  вычисления  абсолютного
адреса данных DOS складывает значения регистров DS и DX (DS:DX).


     ПРОГРАММА: ВЫВОД НА ЭКРАН НАБОРА СИМВОЛОВ КОДА ASCII
     ________________________________________________________________

     Большинство из 256 кодов  ASCII  имеют  символьное  представление,  и
могут быть выведены на экран.  Шест. коды 00 и  FF  не  имеют  символов  и
выводятся на экран в виде пробелов, хотя  символ  пробела  имеет  в  ASCII
шест. код 20.
     На рис.8.1 показана COM-программа, которая выводит  на  экран  полный
набор символов кода  ASCII.  Программа  вызывает  три  процедуры;  B10CLR,
C10SET и D10DISP.  Процедура B10CLR  очищает  экран,  а  процедура  C10SET
устанавливает  курсор  в  положение  00,00.  Процедура  D10DISP    выводит
содержимое поля CTR, которое в  начале  инициализировано  значением  00  и
затем yвеличивается на 1 при каждом выводе на  экран,  пока  не  достигнет
шест. значения FF.

__________________________________________________________________________

        page    60,132
TITLE   ALLASC  (COM) Вывод на экран ASCII-символов 00-FF
CODESC  SEGMENT PARA 'Code'
        ASSUME  CS:CODESG,DS:CODESG,SS:CODESG,ES:NOTHING
        ORG     100H
BEGIN:  JMP     SHORT MAIN
CTR     DB      00,'S'

;               Основная процедура:
;               ------------------
MAIN    PROC    NEAR
        CALL    B10CDR          ;Очистить экран
        CALL    C10SET          ;Установить курсор
        CALL    D10DISP         ;Вывести символ на экран
        RET
MAIN    ENDP
;               Очистка экрана:
;               --------------
B10CLR  PROC
        MOV     AX,0600H
        MOV     BH,07
        MOV     CX,0000         ;Левая верхняя позиция
        MOV     DX,184FH        ;Правая нижняя позиция
        INT     10H
        RET
B10CLR  ENDP
;               Установка курсора в 00,00:
;               -------------------------
C10SET  PROC
        MOV     AN,02
        MOV     BN,00
        MOV     DX,0000
        INT     10H
        RET
C10SET  ENDP
;               Вывод на экран ASCII символов:
;               -----------------------------
D10DISP PROC
        MOV     CX,256          ;256 итераций
        LEA     DX,CTR          ;Адрес счетчика
D20
        MOV     AH,09           ;Функция вывода символа
        INT     21H
        INC     CTR             ;Увеличить счетчик
        LOOP    D20             ;Уменьшить CX,
                                ; цикл, если не ноль
        RET                     ;Вернуться
D10DISP ENDP

CODESG  ENDS
        END     BEGIN
__________________________________________________________________________

     Рис.8.1. Вывод на экран набора символов кода ASCII


     Так как символ доллара не выводится на экран и  кроме  того  коды  от
шест.08 до шест.0D являются специальными управляющими  cимволами,  то  это
приводит к перемещению курсора и другим управляющим воздействиям. Задание:
введите  программу  (рис.8.1),  выполните  ассемблирование,  компоновку  и
преобразование в COM-файл. Для запуска программы введите ее имя, например,
В:ASCII.COM.
     Первая выведенная строка начинается с пробельного символа  (шест.00),
двух "улыбающихся лиц" (шест.01 и 02) и трех карточных символов  (шест.03,
04  и  05).  Код  07  выдает  звуковой сигнал.  Код 06 должен отобразиться
карточным символом "пики",  но управляющие символы от шест.08 до 0D сотрут
его.  Код  0D  является "возвратом каретки" и приводит к переходу на новую
(следующую)строку.  Код шест.0E - представляется в виде музыкальной  ноты.
Символы после шест.7F являются графическими.
     Можно изменить  программу  для  обхода  управляющих  символов.   Ниже
приведен пример фрагмента программы,  позволяющий обойти все символы между
шест.08 и 0D.  Вы  можете  поэкспериментировать,  oбходя  только,  скажем,
шест.08 (возврат на символ) и 0D (возврат каретки):

                    CMP  CTR,08H        ;Меньше чем 08?
                    JB   D30            ; да - принять
                    CMP  CTR,0DH        ; Меньше/равно 0D?
                    JBE  D40            ; да - обойти
          D30:
                    MOV  AH,40H         ;Вывод символов < 08
                    ...                 ;             и > 0D
                    INT  21H
          D40:
                    INC  CTR


     ВВОД ДАННЫХ С КЛАВИАТУРЫ: БАЗОВАЯ ВЕРСИЯ DOS
     ________________________________________________________________

     Процедура ввода данных с клавиатуры проще, чем вывод  на  экран.  Для
ввода, использующего базовую DOS, область  ввода  требует  наличия  cписка
параметров, содержащего поля, которые необходимы  при  выполнении  команды
INT.  Во-первых,  должна  быть  определена  максимальная  длина  вводимого
текста.  Это необходимо для предупреждения пользователя звуковым сигналом,
если набран слишком длинный текст; символы, превышающие максимальную длину
не принимаются.  Во-вторых, в списке параметров должно  быть  определенное
поле, куда команда возвращает действительную  длину  введенного  текста  в
байтах.
     Ниже приведен пример,  в  котором  определен  список  параметров  для
области ввода. LABEL представляет собой директиву с атрибутом BYTE. Первый
байт содержит максимальную длину вводимых данных. Так как это однобайтовое
поле, то возможное максимальное значение его -  шест.FF  или  255.  Второй
байт  необходим  DOS  для занесения в него действительного числа введенных
символов.  Третьим  байтом  начинается  поле,  которое   будет   содержать
введенные символы.

          NAMEPAR     LABEL     BYTE           ;Список параметров:
          MAXLEN      DB        20             ; Максимальная длина
          ACTLEN      DB        ?              ; Реальная длина
          NAMEFLD     DB        20 DUP (' ')   ; Введенные символы

     Так как в списке параметров директива LABEL  не  занимает  места,  то
NAMEPAR и MAXLEN указывают на один и тот же aдрес  памяти.  В  трансляторе
MASM  для  определения  списка  параметров  в   виде    структуры    может
использоваться также директива STRUC. Однако, в связи с тем, что ссылки на
имена, определенные внутри,  требуют  специальной  адресации,  воздержимся
cейчас от рассмотрения данной темы до гл.24 "Директивы ассемблера".
     Для запроса на ввод необходимо поместить в регистр AH номер функции -
10 (шест.  0AH),  загрузить  адрес  списка  параметров  (NAMEPAR  в  нашем
примере) в регистр DX и выполнить INT 21H:

               MOV  AH,0AH         ;Запрос функции ввода
               LEA  DX,NAMEPAR     ;Загрузить адреса списка параметров
               INT  21H            ;Вызвать DOS

     Команда INT ожидает пока пользователь не введет с  клавиатуры  текст,
проверяя  при  этом,  чтобы  число  введенных  cимволов    не    превышало
максимального  значения,  указанного  в  списке  параметров  (20  в  нашем
примере).  Для указания конца ввода пользователь нажимает клавишу  Return.
Код этой клавиши (шест. 0D) также заносится в поле ввода (NAMEFLD в  нашем
примере).  Если, например, пользователь ввел имя BROWN (Return), то cписок
параметров будет содержать информацию:

               дес.:  |20| 5| В| R| O| W| N| #|  |  |  |  | ...
               шест.: |14|05|42|52|4F|57|4E|0D|20|20|20|20| ...

     Во второй байт списка параметров (ACTLEN  в  нашем  примере)  команда
заносит длину введенного имени  -  05.  Код  Return  находится  по  адресу
NAMEFLD +5. Символ # использован здесь для индикации конца данных, так как
шест. 0D не имеет отображаемого символа. Поскольку максимальная длина в 20
символов включает шест.0D, то действительная длина вводимого текста  может
быть только 19 символов.


     ПРОГРАММА: ВВОД И ВЫВОД ИМЕН
     ________________________________________________________________

     EXE-программа, приведенная на рис. 8.2, запрашивает ввод имени, затем
отображает в середине экрана введенное имя  и  включает  звуковой  сигнал.
Программа продолжает запрашивать и отображать имена, пока пользователь  не
нажмет Return в ответ на  очередной  запрос.  Рассмотрим  ситуацию,  когда
пользователь ввел имя TED SMITH:
Предыдущая страница Следующая страница
1 ... 16 17 18 19 20 21 22  23 24 25 26 27 28 29 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама