Assembler для начинающих






    Другая форма команды перехода - переход к подпрограмме.  Некоторая
    последовательность команд образует процедуру.  Эта последователь-
    ность реализует функцию, которая выполняется в программе
    неоднократно и в разных местах.  Вместо многократного повторения
    этой последовательности во всех необходимых местах, программист
    помещает эти команды в одном месте.  Такая часть программы
    становится подпрограммой или процедурой.
 
      Каждый раз как в программе потребуется выполняемая процедурой
    функция, она передает управление в эту процедуру командой перехода
    на нее.  Переход на процедуру называется вызовом процедуры или
    командой вызова.  Вызов процедуры отличается от команды перехода.
    Команда вызова сохраняет адрес следующей за ней команды.  Этот
    адрес, называемый адресом возврата, указывает дорогу обратно к
    исходной последовательности команд.
 
      Давайте посмотрим, как работает вызов процедуры.  Пусть, напри-
    мер, нам надо написать программу, которая складывает в нескольких
    местах 32-битовые числа.  У микропроцессора 8088 нет команд,
    которые выполняли бы такое сложение.  Мы можем написать короткую
    последовательность команд, которая будет выполнять сложение
    32-битовых чисел.  Эта часть программы будет процедурой.
 
      Программист пишет эту подпрограмму точно также как любую другую
    часть программы.  Она является частью программы на языке
    ассемблера.  При написании основной части прикладной программы
    программист будет иногда сталкиваться с необходимостью сложить два
    32-битовых числа.  Вместо того, чтобы писать команды для выполнения
    этого сложения, в программу включают вызов процедуры 32-битового
    сложения.  Сразу после него продолжаются команды основной части
    программы.    Вызов этой процедуры производит впечатление мощной
    команды 8088, так как один такой вызов выполняет 32-битовое
    сложение.
 
      При выполнении программы выозов процедуры выполняет не само
    сложение с двойной точностью, а передачу управления соответствующей
    процедуре.    Процессор выполняет команды процедуры, реализующей
    сложение.  Последняя команда процедуры является специальной
    командой для процедур и называется возвратом.  Команда возврата
    берет адрес, который был сохранен командой вызова и помещает его
    обратно в указатель команд.  Это заставляет программу вернуться к
    команде, следующей за вызовом процедуры.  Вызов процедуры как бы
    временно отводит течение программы в русло процедуры.  После
    выполнения процедуры выполнение возвращается к основной программе.
 
      Команды, которые обеспечивают выполнение процедуры - CALL и
    RETURN.  CALL - это переход на процедуру.  CALL сохраняет текущее
    значение указателя команд в специальном месте памяти.  Это
    сохраненное значение указателя команд является адресом возврата.
    Команда RETURN читает сохраненное значение указателя команд, поме-
    щает его в указатель команд процессора и возвращает управление в
    точку, следующую за командой CALL.    Пример на Фиг.    2.18 показывает
    процедуру, вызываемую из двух различных точек программы.
 
      Поскольку программа начинает свое выполнение с самого начала,
    она сразу же попадает на команду A1.  Команда CALL передает
    управление в точку SOBROUTINE.  Выполняя команду CALL, процессор
    в том числе сохраняет адрес точки A2.  После выполнения процедуры
    команда RET (от английского return - возврат) восстанавливает
    сохраненное значение A2.  Управление возвращается к главной
    программе.    Дальше в главной прграмме выполняется CALL в точке A3,
    что приводит к повторному выполнению подпрограммы.      На этот раз
    процессор сохраняет значение A4.  После выполнения процедуры во
    второй раз управление возвращается в A4.  Обратите внимание, что
    оба раза выполнялась одна процедура.  В первый раз возврат после ее
           Microsoft (R) Macro Assembler Version 5.00             5/11/80 16:25:59
           Фиг. 2.18 Использование процедуры                      Page   1-1
 
 
                                         PAGE    ,132
                                         TITLE   Фиг. 2.18 Использование процедуры
            0000                   CODE    SEGMENT
                                         ASSUME  CS:CODE
 
            0000  E8 0008 R              A1:     CALL    SUBROUTINE
 
            0003  40                     A2:     INC     AX
 
            0004  E8 0008 R              A3:     CALL    SUBROUTINE
 
            0007  43                     A4:     INC     BX
 
                                   ;-----  Здесь программа продолжается . . .
 
            0008                   SUBROUTINE      PROC    NEAR
 
            0008  B8 0000                      MOV     AX,0
            000B  BB 0000                      MOV     BX,0
            000E  C3                           RET
 
            000F                   SUBROUTINE      ENDP
 
            000F                   CODE    ENDS
                                         END
 
 
                       Фиг. 2.18 Использование процедуры
 
 
    выполнения осуществлялся на A2, во второй раз - на A4.
    Преимущество процедуры заключается в ее способности вызываться из
    множества различных мест и каждый раз правильно находоить точку
    возврата.
 
      Где же хранится адрес возврата во время выполнения процедуры?
    Существует множество возможностей, но микропроцессор 8088
    использует для хранения этого значения стек.