Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ассемблер.doc
Скачиваний:
26
Добавлен:
25.08.2019
Размер:
526.34 Кб
Скачать

2.11. Процедуры

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

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

1 PAGE ,132

2 TITLE Фиг. 2.18 Использование процедуры

3 0000 CODE SEGMENT

4 ASSUME CS:CODE

5 0000   E8 0008 R A1: CALL SUBROUTINE

6 0003   40                 A2: INC AX

7 0004   E8 0008 R A3: CALL SUBROUTINE

8 0007   43                 A4: INC BX ;----- Здесь программа продолжается ...

9 0008 SUBROUTINE PROC NEAR

10 0008   B8 0000                MOV AX,0

11 000B   BB 0000                  MOV BX,0

12 000E   C3                       RET

13 000F SUBROUTINE ENDP

14 000F CODE ENDS

15 END

Фиг. 2.18 Использование процедуры

выполнения осуществлялся на A2, во второй раз - на A4. Преимущество процедуры заключается в ее способности вызываться из множества различных мест и каждый раз правильно находоить точку возврата.

Где же хранится адрес возврата во время выполнения процедуры? Существует множество возможностей, но микропроцессор 8088 использует для хранения этого значения стек.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]