Главная · Поиск книг · Поступления книг · 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 ... 20 21 22 23 24 25 26  27 28 29 30 31 32 33 ... 198
         тырьмя знаками "тире" и буквой R.  При загрузке программы  MS-DOS
         вставляет в программу действительное значение для его использова-

                                      - 2-24 -
         ния в процессе выполнения программы.  Это значение является адре-
         сом ячейки памяти,  в которую была загружена переменная data_seg.
         Таким образом, с помощью MS-DOS, программный код и области данных
         могут быть перемещены в физической памяти.

                 Листинг 2-6. Листинг для заголовка программы .EXE
         -----------------------------------------------------------------

         0000                           code_seg SEGMENT
                                                 ASSUME cs:code_seg
                                                 ASSUME ds:data_seg
         0000                           main     PROC   FAR
         0000                           start:
         0000 B8 ---- R                          mov     ax,data_seg
         0003 8E D8                              mov     ds,ax
         0005 8E C0                              mov     es,ax
         -----------------------------------------------------------------

                             Отдельные области данных

             Если в программе определяется несколько сегментов данных (ис-
         пользуя,  соответственно,  директивы ASSUME), то внутренние прог-
         раммы могут иметь отдельные области данных. Но, при обычном стиле
         программирования каждый раз при вызове программы каждая программа
         ограничена доступом к одной и той же области данных. Область дан-
         ных предназначена для программы и наоборот.
             При обычном использовании назначенные области не являются по-
         мехой,  так как большинство программ выполняется последовательно,
         одна за другой. Но, что произойдет, если попытаться выполнить од-
         ну  и  ту же  процедуру более одного раза и в одно и то же время?
         Будет или нет более поздний вызов  перезаписывать  предшествующие
         вызовы данных,  из-за того,  что программа использует только одну
         область данных? Здесь можно удивиться, почему одна и та же проце-
         дура будет вызываться более одного раза одновременно?
             По крайней мере,  это возможно  в  трех  случаях.  Во-первых,
         мультизадачные  системы  могут  иметь множество выполняемых прог-
         рамм, разделяющих общие библиотеки программ, называемые библиоте-
         ками  исполнимых  модулей (потому что программный код доступен во
         время исполнения,  а не включается в программу во время компонов-
         ки).  Вместо наличия нескольких копий внутренних программ, разме-
         щенных в программном файле,  библиотеки исполнимых модулей  имеют
         только одну копию программы, размещенной в памяти (для более под-
         робного обсуждения библиотек исполнимых модулей смотри  главу 3).
         Если бы даже все они могли выполнять одну и ту же программу в од-
         но и то же время,  библиотеки исполнимых модулей должны  были  бы
         иметь отдельные области данных,  чтобы избежать неумышленное сов-
         местное использование и порчу данных.
             Второй случай, когда одна и та же процедура может быть вызва-
         на программами одновременно,  происходит  в  системах  управления
         прерываниями.  Допустим,  что  выполняется  некоторая программа и
         произошло прерывание из-за некоторого внешнего события.  Програм-
         ма, обслуживающая прерывание, начинает выполнение и ей необходимо
         вызвать программу,  которая была прервана.  Если она не имеет от-
         дельной области данных, то программа обслуживания прерывания раз-
         рушит данные, относящиеся к прерванной программе. По этой причине
         программам обслуживания прерываний необходимо иметь отдельные об-
         ласти данных.

                                      - 2-25 -

                               Рекурсивные программы

             Третий случай использования отдельных областей данных  проис-
         ходит  тогда,  когда программе необходимо вызвать саму себя.  Это
         является общим средством решения проблем и носит название "рекур-
         сия".  Хорошим примером этого механизма является функция вычисле-
         ния факториала некоторого целого числа.  В листинге  2-7  показан
         пример  решения проблемы вычисления факториала.  Алгоритм решения
         не столь элегантен,  и не содержит проверку на  переполнение  при
         умножении,  но  он выглядит удовлетворительно для значений N от 1
         до 7.

              Листинг 2-7.  Решение проблемы рекурсии для вычисления
                                    факториала
         -----------------------------------------------------------------

         factor  PROC NEAR              ; нахождение факториала числа N
                 cmp  ax,2              ; уже достигнут конец?
                 jne  subfact           ; нет, вычисление (N - 1)!
                 mov  ax,2              ; да, выполнение сначала
                 ret
         subfact:
                 push ax                ; сохранение текущего значения N
                 sub  ax,1              ; получение N - 1
                 call factor            ; запрос (N - 1)!
                 pop  bx                ; восстановление значения N
                 mul  bx                ; N x (N [min]-1)! = N!
                 ret
         factor  ENDP
         -----------------------------------------------------------------

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

             Во всех  вышеперечисленных  случаях  данные  программы должны
         храниться отдельно от ее программного кода так,  чтобы  несколько
         процедур, каждая с ее собственными областями данных, могли бы вы-
         полнять программный код в одно и то  же  время.  Если  встретился
         этот критерий,  то говорят, что программа повторно-входимая (пов-
         торно-используемая).  Т.е. программа может быть вызвана (введена)
         при  одном  программном  потоке,  пока все еще выполняется другой
         программный поток. Слова "программный поток" указывают на то, что
         неважно,  вызвана ли программа другой программой, или она вызвала
         сама себя (рекурсия).
             В действительности, данные, подлежащие сохранению, сохраняют-
         ся  в стеке вызывающей программы.  Это возможно только при рекур-
         сии,  поскольку программист знает,  когда управление передается в
         новую программу, и может предвидеть необходимость установки новой
         области данных.  Для многопользовательских прикладных программ  и
         прикладных  программ обработчиков-прерываний это не является дос-
         таточным и программы должны иметь  свои  данные,  защищенные  все
         время.  Управление  в такие программы может быть передано в любое
         время.  В этих случаях устанавливайте локальную  область  данных,
         когда программа вводится в первый раз. Эта локальная область дан-
         ных может быть распределена двумя различными способами:  в  стеке
         или в памяти.

                             Локальная память в стеке

             Для локальной памяти в стеке может быть  зарезервирован  блок
         стека  посредством  уменьшения указателя стека.  Любые прерывания
         или вызовы,  происходящие после этого,  могут теперь обеспечить в
         этом блоке стека сохранение любых локальных данных, относящихся к
         прерванной программе. Это самый удобный способ сохранения данных,
         но требующий, чтобы доступ ко всем локальным переменным выполнял-
         ся через регистр BP (для обсуждения этого  смотри  предшествующий
         раздел,  озаглавленный  "Передача  данных в стек").  Пример этого
         способа, снабженный примечаниями, содержится в листинге 2-8.

               Листинг 2-8. Использование стека для локальной памяти
         -----------------------------------------------------------------

                           ; Вызывающая процедура

                 ...    ...
                push    ; передача 3-го аргумента
                push    ; передача 2-го аргумента
                push   
Предыдущая страница Следующая страница
1 ... 20 21 22 23 24 25 26  27 28 29 30 31 32 33 ... 198
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 

Реклама