Главная · Поиск книг · Поступления книг · 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 ... 53 54 55 56 57 58 59  60 61 62 63 64 65 66 ... 85
                                 MOV     AX,DSNAME
                                 MOV     DS,AX
                                 MOV     ES,AX
                                 ENDM                 ;Конец макрокоманды
                         ; ----------------------------------------------
0000                     STACK   SEGMENT PARA STACK 'Stack'
0000     20 [ ???? ]             DW      32 DUP(?)
0040                     STACK   ENDS
                         ; ----------------------------------------------
0000                     DSEG    SEGMENT PARA 'Data'
0000  54 65 73 74 20 6F  MESSAGE DB      'Test of macro', '$'
      66 20 6D 61 63 72
      6F 24
000E                     DSEG    ENDS
                         ; ----------------------------------------------
0000                     CSEG    SEGMENT PARA 'Code'
0000                     BEGIN   PROC    FAR
                                 INIT2   CSEG,DSEG,STACK
0000  1E                +        PUSH    DS
0001  2B C0             +        SUB     AX,AX
0003  50                +        PUSH    AX
0004  B8 ---- R         +        MOV     AX,DSEG
0007  8E D8             +        MOV     DS,AX
0009  8E C0             +        MOV     ES,AX
000B  B4 09                      MOV     AH,09          ;Вывод на экран
000D  8D 16 0000 R               LEA     DX,MESSGE      ;Сообщение
0011  CD 21                      INT     21H
0013  CB                         RET
0014                     BEGIN   ENDP
0014                     CSEG    ENDS
                                 END     BEGIN
__________________________________________________________________________

     Рис.20.2. Использование параметров в макрокомандах.


     КОММЕНТАРИИ
     ________________________________________________________________

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

               PROMPT    MACRO     MESSGE
               ;Эта макрокоманда выводит сообщения на экран
                         MOV       AH,09H
                         LEA       DX,MESSGE
                         INT       21H
                         ENDM

     Так как по умолчанию в листинг попадают только  команды  генерирующие
объектный код, то ассемблер не будет автоматически выдавать и комментарии,
имеющиеся  в  макроопределении.  Если  необходимо,  чтобы  в    расширении
появлялись комментарии, следует использовать перед макрокомандой директиву
.LALL ("list all" - выводить все), которая кодируется вместе с  лидирующей
точкой:
               .LALL
               PROMPT    MESSAG1

     Макроопределение  может  содержать  несколько  комментариев,   причем
некоторые из них могут выдаваться в листинге, а другие  -  нет.  В  первом
случае необходимо использовать директиву .LALL.  Во  втором  -  кодировать
перед комментарием два символа точка с запятой (;;) -  признак  подавления
вывода  комментария  в  листинг.  По  умолчанию  в  ассемблере   действует
директива .XALL, которая выводит в листинг  только  команды,  генерирующие
объектный  код.  И,  наконец,  можно  запретить  появление   в    листинге
ассемблерного  кода  в  макрорасширениях,  особенно   при    использовании
макрокоманды в одной программе несколько раз.  Для этого служит  директива
.SALL ("suppress all" - подавить весь  вывод),  которая  уменьшает  размер
выводимого листинга, но не оказывает никакого влияния на размер объектного
модуля.
     Директивы управления листингом .LALL,  .XALL,  .SALL  сохраняют  свое
действие по всему тексту программы,  пока  другая  директива  листинга  не
изменит его.  Эти директивы можно размещать в программе так, чтобы в одних
макрокомандах распечатывались комментарии, в других - макрорасширения, а в
третьих подавлялся вывод в листинг.
     Программа на рис.20.3 демонстрирует описанное выше свойство  директив
листинга. В  программе  определено  два  макроопределения  INIT2 и PROMPT,
рассмотренные ранее.  Кодовый  сегмент  содержит   директиву   .SALL   для
подавления  распечатки  INIT2  и  первого  расширения PROMPT.  Для второго
расширения PROMPT директива .LALL указывает ассемблеру на вывод в  листинг
комментария   и   макрорасширения.   Заметим,   однако,  что  комментарий,
отмеченный двумя символами точка с запятой (;;) в макроопределении PROMPT,
не  распечатывается  в  макрорасширениях  независимо  от действия директив
управления листингом.

__________________________________________________________________________

                         TITLE   MACRO3  (EXE) Директивы .LALL и .SALL
                         ; -----------------------------------------------
                         INIT2   MACRO   CSNAME,DSNAME,SSNAME
                                 ASSUME  CS:CSNAME,DS:DSNAME
                                 ASSUME  SS:SSNAME,ES:DSNAME
                                 PUSH    DS
                                 SUB     AX,AX
                                 PUSH    AX
                                 MOV     AX,DSNAME
                                 MOV     DS,AX
                                 MOV     ES,AX
                                 ENDM
                         ; -----------------------------------------------
                         PROMPT  MACRO   MESSAGE
                         ;   Макрокоманда выводит на экран любые сообщения
                         ;;  Генерирует команды вызова DOS
                                 MOV     AH,09          ;Вывод на экран
                                 LEA     DX,MESSAGE
                                 INT     21H
                                 ENDM
                         ; -----------------------------------------------
0000                     STACK   SEGMENT PARA STACK 'Stack'
0000     20 [ ???? ]             DW      32 DUP (?)
0040                     STACK   ENDS
                         ; -----------------------------------------------
0000                     DATA    SEGMENT PARA 'Data'
0000  43 75 73 74 6F 6D  MESSG1  DB      'Customer name?', '$'
      65 72 20 6E 61 6D
      65 3F 24
000F  43 75 73 74 6F 6D  MESSG2  DB      'Customer address?', '$'
      65 72 20 61 64 64
      72 65 73 73 3F 24
0021                     DATA    ENDS
                         ; -----------------------------------------------
0000                     CSEG    SEGMENT PARA 'Code'
0000                     BEGIN   PROC    FAR
                                 .SALL
                                 INIT2   CSEG,DATA,STACK
                                 PROMPT  MESSG1
                                 .LALL
                                 PROMPT  MESSG2
                       + ;   Макрокоманда выводит на экран любые сообщения
0013  B4 09            +         MOV     AH,09          ;Вывод на экран
0015  8D 16 000F R     +         LEA     DX,MESSG2
0019  CD 21            +         INT     21H
001B  CB                         RET
001C                     BEGIN   ENDP
001C                     CSEG    ENDS
                                 END     BEGIN
__________________________________________________________________________

     Рис.20.3. Распечатка и подавление макрорасширений в листинге.


     ИСПОЛЬЗОВАНИЕ МАКРОКОМАНД В МАКРООПРЕДЕЛЕНИЯХ
     ________________________________________________________________

     Макроопределение может содержать ссылку на  другое  макроопределение.
Рассмотрим простое макроопределение DOS21, которое заносит  в  регистр  AH
номер функции DOS и выполняет INT 21H:

               DOS21     MACRO     DOSFUNC
                         MOV       AH,DOSFUNC
                         INT       21H
                         ENDM

Для использования данной макрокоманды при вводе  с  клавиатуры  необходимо
закодировать:

               LEA       DX,NAMEPAR
               DOS21     0AH

Предположим, что имеется другое макроопределение, использующее функцию  02
в регистре AH для вывода символа:

               DISP      MACRO     CHAR
                         MOV       AH,02
                         MOV       DL,CHAR
                         INT       21H
                         ENDM

Для  вывода  на  экран,  например,  звездочки   достаточно    закодировать
макрокоманду  DISP  '*'.    Можно    изменить    макроопределение    DISP,
воспользовавшись макрокомандой DOC21:

               DISP      MACRO     CHAR
                         MOV       DL,CHAR
                         DOS21     02
                         ENDM

Теперь, если закодировать макрокоманду DISP в виде DISP '*', то  ассемблер
сгенерирует следующие команды:

                         MOV       DL,'*'
                         MOV       AH,02
                         INT       21H


     ДИРЕКТИВА LOCAL
     ________________________________________________________________

     В некоторых макрокомандах требуется определять  элементы  данных  или
метки команд.  При использовании  такой  макрокоманды  в  программе  более
одного раза происходит также неоднократное  определение  одинаковых  полей
данных или меток.  В результате ассемблер выдаст сообщения об ошибке из-за
дублирования имен.  Для обеспечения  уникальности  генерируемых  в  каждом
макрорасширении имен  используется  директива  LOCAL,  которая  кодируется
непосредственно после директивы MACRO,  даже  перед  комментариями.  Общий
формат имеет следующий вид:

               LOCAL dummy-1,dummy-2,...     ;Формальные параметры

     Рис.20.4 иллюстрирует использование директивы LOCAL. В приведенной на
этом рисунке программе выполняется деление вычитанием; делитель вычитается
из  делимого и частное увеличивается на 1 до тех пор,  пока делимое больше
делителя.  Для данного алгоритма необходимы две метки: COMP - адрес цикла,
OUT - адрес выхода из цикла по завершению. Обе метки COMP и OUT определены
как LOCAL и могут иметь любые правильные ассемблерные имена.
     В макрорасширении для COMP генерируется метка ??0000,  а  для  OUT  -
??0001. Если макрокоманда DIVIDE будет использована в этой  программе  еще
один раз, то в следующем макрорасширении будут сгенерированы метки  ??0002
и  ??0003  соответственно.  Таким  образом,  с  помощью  директивы   LOCAL
обеспечивается уникальность меток в макрорасширениях в одной программе.

__________________________________________________________________________

                      TITLE   MACRO4  (COM) Использование директивы LOCAL
                      ; -------------------------------------------------
                      DIVIDE  MACRO   DIVIDEND,DIVISOR,QUOTIENT
                              LOCAL   COMP
                              LOCAL   OUT
                      ;       AX=делимое, BX=делитель, CX=частное
                              MOV     AX,DIVIDEND    ;Загрузить делимое
                              MOV     BX,DIVISOR     ;Загрузить делитель
                              SUB     CX,CX          ;Регистр для частного
                      COMP:
                              CMP     AX,BX          ;Делимое < делителя?
                              JB      OUT            ; да - выйти
                              SUB     AX,BX          ;Делимое - делитель
                              INC     CX             ;Частное + 1
                              JMP     COMP
                      OUT:
                              MOV     QUOTIENT,CX    ;Записать результат
                              ENDM
                      ; ------------------------------------------------
0000                  CSEG    SEGMENT PARA 'Code'
                              ASSUME  CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG
0100                          ORG     100H
0100  EB 06           BEGIN:  JMP     SHORT MAIN
                      ; ------------------------------------------------
Предыдущая страница Следующая страница
1 ... 53 54 55 56 57 58 59  60 61 62 63 64 65 66 ... 85
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (15)

Реклама