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