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

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


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

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


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

Программирование и кодирование

Предыдущая страница Следующая страница
1 2 3  4 5 6 7 8 9 10 11 12 13 14 ... 198
         щие обсуждения,  ясно,  что сказано далеко не все. В действитель-
         ности,  подобное  обсуждение  фокусируется  только на структурном
         программировании.  Как Вы скоро увидите, структурное программиро-
         вание возможно на любом языке. Модные структуры управления языков
         высокого уровня поддерживают даже некоторые ассемблеры.  Одним из
         таких  ассемблеров является  Макро Ассемблер фирмы Майкрософт для
         операционной системы MS-DOS, широко известный под названием MASM.

                     Потребность в короткой записи операторов
            Прежде чем представить структуры управления высокого  уровня в
         языке  Ассемблера мы рассмотрим некоторые преимущества языков вы-
         сокого уровня.  Так или иначе все заканчивается на уровне ассемб-
         лера. Что же выигрывается от использования языка высокого уровня?
            Возможность выражать программистскую идею в форме, легко пони-
         маемой программистом или специалистом.  Предположим,  что каждому
         оператору ассемблера в большей или меньшей  степени соответствует
         одна машинная команда.С другой стороны, один оператор языка высо-
         кого уровня может расширяться до десятков или даже сотен машинных
         инструкций.  (Тот,  кто сомневается в расширении до сотен,  может
         проверить это,  проанализировав работу вычислительной подпрограм-
         мы на языке Фортран, имеющей множество аргументов).
            На Рис.1-1 показан фрагмент одной и той же программы, реализо-
         ванный на Фортране и языке Ассемблера 8086.  Этот фрагмент вычис-
         ляет сумму 1...  NUM для данного NUM. Нет сомнений, что программа
         на  ассемблере  прежде  всего  может  быть оптимизирована с целью

                 Фортран                      Aссемблер

                 sum = 0                      mov  sum,0
                 DO 100 I = 1, NUM            mov  ax,1
             100 SUM =SUM +I          loop1:  cmp  ax,num
                                              jg   loop1_end
                                              add  sum,ax
                                              inc  ax
                                              jmp  loop1
                                      loop1_end:
             Рис. 1-1. Сравнение Фортрана с Ассемблером

                                      - 1-2 -
         уменьшения или количества выполняемых команд,  или времени выпол-
         нения программы. Но вне зависимости от того, как к этому подойти,
         легче написать программу на Фортране,  чем на Ассемблере. Для на-
         писания программы на Ассемблере должно быть принято гораздо боль-
         ше решений.  В силу значительной сложности работы по программиро-
         ванию на ассемблере ошибки кодирования  более  вероятны.  Я  могу
         быть уверен,  что программа на Фортране будет выполняться превос-
         ходно,  но я не могу сказать этого о программе на ассемблере. По-
         чему возникают такие сомнения? Потому что каждая строка программы
         на Фортране представляет собой законченную мысль,  в то время как
         ассемблерная  программа  требует для реализации той же мысли мно-
         жества строк.
            Короче говоря,  использование конструкций высокого уровня при-
         водит к облегчению процесса программирования и  повышению  надеж-
         ности  программ.  Такие конструкции делают программирование менее
         сложным,  что позволяет программисту сконцентрироваться на логике
         программы. Естественно, что программисты хотели бы быть уверены в
         правильности результатов своей работы. Инструментальные средства,
         поддерживающие такую уверенность, приводятся в нижеследующих раз-
         делах.

                                Введение в МАКРОСЫ

            Таким образом, программирование на языке Ассемблера может быть
         значительно облегчено, если  иметь возможность создавать "стеног-
         рамму" часто используемых операторов.  MASM обеспечивает эту воз-
         можность через средства макро. Макро представляют собой "суперко-
         манды",  которые  разгружают  MASM  от  части  лишней   и   часто
         повторяющейся работы по обработке ассемблерной программы. При по-
         мощи макросов программисты определяют блоки ассемблерных операто-
         ров,  а  затем,  используя  конкретные ссылки,  указывают MASM на
         включение соответствующих блоков в ассемблерную программу. В этой
         главе  мы  рассмотрим некоторые из таких макросов и понемногу ра-
         зовьем Ваши способности по написанию собственных инструментариев.
         Все  это  позволит Вам соединить скорость выполнения ассемблерной
         программы с мощностью языка высокого уровня.
            Для создания  и использования макро необходимо выполнить 2 ша-
            га:
                             Шаг 1. Определение макро

                    ;; Определить    "Требуемую функцию" типа @DosCall
                    @DosCall        MACRO
                                    int 21h   ;для выполнения функции обра-
                                    ENDM      ;титься к MS-DOS
                            Шаг 2. Использование макро

                                    @DosCall       <--- вызов макро

            В листинге появится следующее:

                                   @DosCall        <--- вызов макро
                    1              int 21h    ;для выполнения функции обра-
                                              ;титься к MS-DOS

            При ассемблировании программы оператор DosCall  заменяется  на
         оператор  int  21h,  включая комментарий.  Файл листинга содержит
         строку DosCall как ссылку,  однако объектный файл содержит только

                                      - 1-3 -
         код для инструкции int 21h. Такая операция известна под названием
         "подстановка макро" или " расширение макро".
            Заметьте, что  в  предыдущем  примере ассемблер вставил в файл
         листинга символ, обозначающий код расширенного макро. В MASM вер-
         сии 4 и выше "1" помещается в строки, принадлежащие первому уров-
         ню макрорасширения,  "2" используется для второго уровня и т.д. В
         MASM  версии 3 и предыдущих версий все строки макрорасширения вне
         зависимости от уровня помечаются символом плюс (+).
            При обработке  ассемблером ссылка на макро заменяется на прог-
         раммный код, который это макро представляет. Макро не вырабатыва-
         ет команду СALL (вызвать),  обращенную к коду макро,  хотя ссылки
         на макро порой и используют такой путь.
            Подобно другим  конструкциям в программировании макросы должны
         следовать строгим правилам. Форма описания макроса следующая:

            mname      MACRO     argument_list
                       .
                       .      <--- тело макрокода
                       .
                       ENDM

            Имя макро определяется как mname, а argument_list представляет
         собой список аргументов,  разделенных запятыми. Если макро не со-
         держит аргументов (как в нашем примере с @DosCall),  список аргу-
         ментов может быть пуст.
            Выше был приведен простейший пример. Если это было бы все, что
         умеет делать макро, то тогда оно было бы довольно примитивным об-
         разованием. К счастью, макросы можно подгонять к конкретным усло-
         виям применения, используя секцию аргументов. Следующее макро яв-
         ляет собой пример подобной настройки.

            ;; Определить "Печать символа" как PrintChr
            @PrintChr  MACRO    char
                       mov  ah,05
                       mov  dl,&char
                       @DosCall
                       ENDM
         И теперь при использовании макро мы пишем:

            @PrintChr 'A'      <--- вызов макро,

         и в нашем листинге появляется следующее:

            @PrintChr 'A'     <--- вызов макро
            1   mov  ah,05
            1   mov  dl,'A'
            2   int 21h   ;для выполнения функции обратиться к MS-DOS

            Конструкция "&char" в макроописании была заменена после вызова
         макро на "A". (Да, мы ссылаемся на макро, как если бы стоял вызов
         call. Это удобно, особенно если вспомнить, что команда CALL в яв-
         ном виде не используется.) Цифра,  появляющаяся в начале  строки,
         представляет  собой  способ,  при  помощи  которого MASM сообщает
         программисту,  что текущий код является результатом макрорасшире-
         ния.  Также заметим, что макро @PrintChr содержит ссылку на ранее
         определенное  макро  @DosCall,  которое  расширяется  в  оператор
         int 21h,  его  представляющий. MASM продолжает "раскручивать" вы-

                                      - 1-4 -
         зовы макро до такого уровня, до которого они вложены, пока не пе-
         реполнится область памяти таблицы  символов.  Вложенность  являет
         собой другой способ сообщения, что макро может вызвать макро, ко-
         торое в свою очередь может вызвать следующее макро и т.д.
            Имя char в макро @PrintChr  называется  формальным  аргументом.
         Всякий раз, когда формальный аргумент char появляется в макро, он
         заменяется на значение, использованное при вызове макро. В приме-
         ре  с  @PrintChr  замена char означает,  что все появления сhar в
         макро заменяются на "A".
            Заметим, что любое имя,  выбранное  для  формального  аргумен-
         та,используется исключительно для этого аргумента. Таким образом,
         если Вы для формального аргумента выбрали имя AX, Вы не можете  в
         данном макро ссылаться на регистр AX!
            Аналогичное предупреждение  действует  и  для именования собс-
         твенно макро. Как только для описания макро Вы выбрали имя add,Вы
         найдете,  что все ссылки на код операции ADD будут вырабатывать в
         данной программе расширение макро add.  При желании,  таким обра-
         зом,  можно изменять директивы MASM. Однако очень важно не созда-
         вать для имен конфликтные ситуации.
            Символ "&" перед char в макро @PrintChr используется  для  до-
         бавления в строку mov dl,  значения char. Символ "&" не нужен для
         раскрутки формального аргумента,  что происходит и так,  а  нужен
         для сообщения MASM, что char является формальным аргументом, а не
         частью более длинной строки "mov dl,char". Как показано в следую-
         щем примере,  оператор "&" особенно важен,  если формальные аргу-
         менты содержатся в длинных строках.

            Макроописание             Макрорасширение
            @Example MACRO  arg       @Example Y
               mov   dl,arg           1  mov  dl,y    <-правильно
               mov   dl,&arg          1  mov  dl,y    <-правильно
               mov   dl,argZ          1  mov  dl,argZ
               mov   dl,&argZ         1  mov  dl,argZ
               mov   dl,arg&Z         1  mov  dl,YZ   <-правильно
               mov   dl,Xarg          1  mov  dl,Xarg
               mov   dl,X&arg         1  mov  dl,XY   <-правильно
               mov   dl,XargZ         1  mov  dl,XargZ
               mov   dl,X&argZ        1  mov  dl,XargZ
               mov   dl,Xarg&Z        1  mov  dl,XargZ
               mov   dl,X&arg&Z       1  mov  dl,XYZ   <-правильно
               ENDM

            Строго говоря, в макро @PrintChr символ "&" не требуется. MASM
         имеет возможность определить, что char - формальный аргумент, так
         как  после  запятой он присутствует в одиночестве.  Тем не менее,
         это хорошая привычка использовать символ "&",  даже когда  он  не
Предыдущая страница Следующая страница
1 2 3  4 5 6 7 8 9 10 11 12 13 14 ... 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама