Другая форма команды перехода - переход к подпрограмме.  Некоторая  последовательность команд образует процедуру.  Эта последовательность реализует функцию, которая выполняется в программе  неоднократно и в разных местах.  Вместо многократного повторения  этой последовательности во всех необходимых местах, программист  помещает эти команды в одном месте.  Такая часть программы  становится подпрограммой или процедурой.

Каждый раз как в программе потребуется выполняемая процедурой  функция, она передает управление в эту процедуру командой перехода  на нее. Переход на процедуру называется вызовом процедуры или  командой вызова.  Вызов процедуры отличается от команды перехода.  Команда вызова сохраняет адрес следующей за ней команды.  Этот  адрес, называемый адресом возврата, указывает дорогу обратно к  исходной последовательности команд.

Давайте посмотрим, как работает вызов процедуры.  Пусть, например, нам надо написать программу, которая складывает в нескольких  местах 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  использует для хранения этого значения стек.