Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по ассемблеру / Лекции по ассемблеру.doc
Скачиваний:
81
Добавлен:
01.05.2014
Размер:
245.25 Кб
Скачать

Использование процедур в ассемблере.

Ассемблер относится как к процедурным языкам (Pascal, C, …), так и к непроцедурным. Считается удобным фрагменты текста на ассемблере оформлять в виде процедур, однако оператор CALL far PTR [BX] позволяет обращаться в произвольное место программы, имя процедуры не используется.

Явное описание процедур:

имя_процедуры PROC [тип] [язык] [uses regs]

тело процедуры

ret; retf или retn

имя_процедуры ENDP

тип: far, near (по умолчанию- near);

язык: (по умолчанию- ассемблер);

regs- сохраняются в стеке.

Схема вызова процедуры. При вызове типа NEAR обрабатывание CS не происходит.

My_Proc ENDP

Ret

- - - - - - - - - - - - Стек

My_Proc PROC IP

CS

- - - - - - - - - - - -

Call My_Proc CS IP

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

  • подготовка параметров для работы с процедурой (типы параметров: значения , ссылки, возвращаемые значения, именования (при макровызовах));

  • сохранение адреса возврата;

  • передача управления на начало процедуры;

  • выполнение тела процедуры, включая сохранение регистров, фиксацию результатов, фиксацию кода завершения, восстановление регистров;

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

Способы передачи параметров.

1). Передача параметров через РОН.

Достоинства: быстрый и удобный;

Недостатки: ограничен в размерах (не более 5).

Применение: написание операционных систем (печать строки. и др.).

2). Передача через общую область памяти. (общие переменные)

Общие переменные описываются следующим образом,

в вызывающей:

PUBLIC список имен (имена переменных или меток).

В вызываемой процедуре:

EXTERN {имя параметра, тип}

Пример:

;головная программа

DATA Segment

EXTERN A:WORD, R:WORD

DATA ENDS

CODE Segment PUBLIC

ASSUME DS:DATA,CS:CODE

PUBLIC PUB_PROC FAR

start:

mov AX, DATA

mov DS, AX

CALL far ptr pub_proc

mov cx, ds:A

sub cx, 2

add cx, ds:R

mov ds:A,cx

ret

CODE ENDP

END start

;Модуль, задающий общие переменные и процедура.

DATA Segment

PUBLIC A, R

A DW 10

B DW 5

C DW 3

B DW 1

DATA ENDS

CODE Segment PUBLIC

ASSUME DS:DATA,CS:CODE

Public Pub_Proc

Pub_Proc Proc Far

mov AX, B

add AX, C

mov R, AX

ret

Pub_Proc ENDP

CODE ENDS

END

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

Такой метод применим не только между ассемблерными модулями, но и с разными языками. STDCALL- стандартная взаимосвязь процедур по параметрам. Основным средством доступа к параметрам является BP, для которого:

  • его значение при запуске процедуры сохраняется в стеке;

  • доступ к параметрам осуществляется с помощью базовой адресации

Структура стека на момент начала работы с параметрами вызванной процедуры:

(Этот вариант используется в языке С.)

BP

 SPBP

CS:IP

 (BP)+2

Par1

 (BP)+4/6

Par2

 (BP)+6/8

………

ParN

 (BP)+(N+4)/(N+6)

Стек

Вариант для Pascal такой же, за исключением порядка параметров.

Пример:

;main

CODE Segment

EXTERN ADD3UP

Push AX

Push BX

Push CX

CALL ADD3UP

ADD SP,6

CODE ENDS

END start

;процедура обработки

ADD3UP Proc NEAR

Public ADD3UP

Push BP

mov BP, SP

mov AX, [BP+4]

add AX, [BP+6]

add AX, [BP+8]

pop BP

ret

ADD3UP ENDP

4). Передача параметров через поток кода.

Передаваемые параметры размещаются непосредственно в коде программы, сразу за вызывающей командой.

Пример:

Call Print_It

db ‘печатная строка’

;продолжение программы.

Плюсы: возможность использования любого числа параметров;

Недостатки: доступ косвенный, следовательно медленный.

5). Передача параметров результата.

Передача параметров результатов может быть реализована через стек, AX (BYTE, WORD), DX:AX (DWORD), ST(0)- вершина стека x87 (FLOAT).

Соседние файлы в папке Лекции по ассемблеру