Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные системы (книга Комаров) / Программирование на Ассемблере (ч 3).doc
Скачиваний:
145
Добавлен:
08.03.2015
Размер:
540.67 Кб
Скачать

Передача параметров через зоны параметров

Zone 

Parametr 1

Parametr 2

Parametr 3

Рис. 3.14. Зона параметров

Этот способ целесообразно использовать, если передаваемые параметры можно расположить в смежных ячейках памяти. Эта область памяти называется зоной параметров (рис.3.14). Для передачи параметров в подпрограмму достаточно передать адрес Zone зоны параметров.

Общая структура программы в этом случае будет иметь вид:

Name PROC

;Чтение входных параметров из зоны параметров

;Обработка данных

;Запись выходных параметров в зону параметров

RET

Name ENDP

;Макроуровень программы

Start: . . . . . . . .

LEA BX, Zone ;Передача адреса зоны

CALL Name ;Обработка данных

Для реализации этого способа также необходимо описывать зоны параметров, которые являются формальными областями:

Пример 3.116:

Вычислить S=A+B,гдеAиBнекоторые слова в памяти.

Для передачи параметров в данном случае потребуется область памяти, состоящая из трех слов. Разместим параметры в области так, чтобы слагаемое A занимало первое слово, B второе слово, а сумма Sтретье слово зоны.

Текст программы для решения этой задачи будет иметь вид:

Zone1 DW?, ?, ? ;Описание зон

. . . . . . . ;параметров

Zone2 DW ?, ?, ?

. . . . . . .

AddWZP PROC

MOV AX, [BX] ;Чтение параметра

ADD AX, [BX+2] ;Сложение слов

MOV [BX+4], AX ;Запись параметра

RET

AddWZP ENDP

;Макроуровень программы

Start: . . . . . . . .

LEA BX, Zone1 ;Передача адреса зоны 1

CALL AddWZP ;Вычисление S1=A1+B1

. . . . . . . .

LEA BX, Zone2 ;Вычисление S2=A2+B2

CALL AddWZP

В рассмотренном примере предполагается, что зоны параметров уже сформированы и содержат необходимые фактические значения.

Достоинством этого способа является простота макроуровня программы, а недостатком необходимость описания и формирования зон параметров.

Передача параметров через стек

Очень часто передача параметров осуществляется через стек. Это обусловлено тем, что стек всегда существует и не требует дополнительного описания.

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

Считывание и запись параметров в стек осуществляется через регистр BP, позволяющий обращаться к стеку, как к ОЗУ с произвольной выборкой. Так как адресация должна осуществляться относительно верхушки стека, то необходимо прежде всего выполнить привязку к ней. Для этого в регистр ВР копируется содержимое указателя стека SP. Перед этим содержимое регистра BP сохраняется в стеке для его дальнейшего восстановления.

Общая структура программы в этом случае будет иметь вид:

Name PROC

PUSH BP ;Сохранение ВP

MOV BP, SP ;Привязка к верхушке стека

MOV REG, [BP+Смещение];Чтение входных параметров из стека

;Обработка данных

MOV [BP+Смещение], REG;Запись выходных параметров в стек

POP BP ;Восстановление BP

RET DATA ;Возврат с исключением входных ;параметров из стека

;Макроуровень программы

Start: . . . . . . . . . . . . . .

SUB SP, CONST ;Резервирование стека под результат

PUSH Параметр ;Передача входных параметров в стек

CALL Name ;Обработка данных

POP Параметр ;Передача выходных параметров ;из стека

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

Рассмотренной структуре программы соответствует схема размещения параметров в стеке, приведенная на рис.3.15,а.

Для определения смещения, добавляемого к содержимому регистра BP при чтении входных и записи выходных параметров в стек, все байты используемой зоны стека должны быть пронумерованы.

Рис. 3.15. Схема размещения параметров в стеке:

а) в общем случае; б) для примера 3.117

После считывания входных параметров в подпрограмму они остаются в стеке. Однако, после возврата из подпрограммы они должны быть удалены из стека, а указатель стека SP должен указывать на зону результата. Для исключения входных параметров из стека служит команда возврата RET DATA. Она отличается от обычной RET тем, что после восстановления адреса возврата прибавляет к регистру SP число DATA. Очевидно, что для исключения входных параметров из стека значение DATA должно быть равно количеству байтов, занимаемых в стеке входными параметрами. Так как все операции со стеком выполняются словами, то число DATA должно быть четным.

Пример 3.117:

ВычислитьS=A+B,гдеA и Bнекоторые слова в памяти.

Поскольку результат этой операции считаем словом, то в стеке под него необходимо зарезервировать два байта.

Текст программы для решения этой задачи будет иметь вид:

AddWSP PROC

PUSH BP ;Сохранение BP

MOV BP, SP ;Привязка к верхушке стека

MOV AX, [BP+6] ;Чтение входного параметра

ADD AX, [BP+4] ;Сложение слов

MOV [BP+8], AX ;Запись выходного параметра

POP BP ;Восстановление BP

RET 4 ;Возврат с исключением входных AddWSP ENDP;параметров

;Макроуровень программы

Start: . . . . . . . .

SUB SP, 2 ;Резервирование слова под результат

PUSH A1 ;Передача входных

PUSH B1 ;параметров

CALL AddWSP ;Вычисление S1=A1+B1

POP S1 ;Передача выходного параметра

. . . . . . . .

SUB SP, 2 ;Вычисление S2=A2+B2

PUSH A2

PUSH B2

CALL AddWSP

POP S2

Этой программе соответствует схема размещения параметров в стеке, приведенная на рис. 3.15,б. Нумерация ячеек стека позволяет определить все необходимые смещения.

При написании такой программы значения смещений к регистру BP сначала не проставляются, но под них оставляется место. Затем по тексту программы составляется схема размещения параметров в стеке и нумеруются его ячейки, начиная от верхушки. После этого определяются смещения, необходимые для обращения к соответствующим элементам в стеке, и записываются в оставленные под них места.

В вышерассмотренных примерах 3.114 3.117 все параметры передавались в подпрограммы и из них своими значениями. Это приемлемо, когда количество передаваемых чисел невелико, и недопустимо при их большом количестве (например, при обработке массивов). Для обработки массивов они передаются в подпрограммы не значениями элементов, которых может быть очень много, а своими атрибутами, основными из которых являются адрес и длина.

Пример 3.118:

Написать подпрограмму для вычисления арифметической суммы элементов некоторого массива байтов без знака. С помощью этой подпрограммы обработать массивArray1.

Поскольку подпрограмма должна обеспечивать обработку произвольного массива, то для решения поставленной задачи атрибуты массива должны передаваться в нее путем передачи параметров.

В качестве примера используем передачу параметров через общие ячейки памяти. В данной задаче для передачи параметров потребуется три общих слова памяти: первое для передачи адреса массива, второедля передачи его длины, третьедля передачи результата.

С учетом этого текст программы для решения поставленной задачи будет иметь вид:

Data SEGMENT

Array1 DB 100DUP(?) ;Описание входного массива

SUM1 DW? ;Описание ячейки результата . . . . . . . . .

FormAddr DW? ;Описание общих FormLenDW? ;ячеек памяти

FormSum DW ?

Data ENDS

. . . . . . . . .

SumArr PROC NEAR

MOV BX, FormAddr ;Чтение входных

MOV CX, FormLen ;параметров

MOV AX, 0 ;Очистка накопителя

Next:ADD AL, [BX] ;Прибавление очередного байта

ADC AH, 0 ;Учет переноса

INC BX ;Модификация адреса

LOOP Next

MOV FormSum, AX ;Передача результата

RET

SumArr ENDP

; Макроуровень программы

Start: . . . . . . . . .

LEA AX, Array1 ;Передача адреса

MOV FormAddr, AX ;массива Array1

MOV AX, LENGTH Array1;Передача длины

MOV FormLen, AX ;массива Array1

CALL SumArr ;Вычисление суммы

MOV AX, FormSum ;Передача суммы

MOV Sum1, AX ;массива Array1

С помощью этой подпрограммы аналогичным образом может быть вычислена сумма элементов и других массивов.