Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Programmirovanie_Lektsii_2015.doc
Скачиваний:
104
Добавлен:
22.03.2016
Размер:
1.19 Mб
Скачать

Типы объединения модулей

<имя сегмента> SEGMENT <параметр(ы)>

[<объединение>]

Параметр «объединение» может принимать следующие значения: PUBLIC, COMMON, STACK.

Обращение к внешним идентификаторам

Внешние имена

Директива EXTRN (external, внешний):

EXTRN <имя>: <тип>, …, <имя>: <тип>

EXTRN X: BYTE ; переменная X размером в байт

Общие имена

Директива PUBLIC

PUBLIC <имя>, …, <имя>

PUBLIC X

Процедуры

.

Описание подпрограммы в виде процедуры:

<имя процедуры> PROC <параметр>

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

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

При параметре NEAR или при его отсутствии процедура называется «близкой», при параметре FAR – «дальней».

Вызов процедур и возврат из них

Чтобы из основной программы вызвать процедуру, необходимо указать в команде перехода имя процедуры.

При обращении к процедуре основная программа обязана сообщить ей адрес возврата.

Как сообщить адрес возврата?

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

  2. Передать через стек: основная программа записывает адрес возврата в стек, а процедура считывает его и использует для перехода.

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

Вызов процедуры (переход с возвратом):

CALL <имя процедуры>

Возврат из процедуры (return):

RET

Связь Паскаль-Ассемблер

  1. Директива компилятора $L: предназначена для поиска объектного файла и компоновке его с программой.

  2. Внешние подпрограммы: каждая процедура или функция ассемблера, которую вы хотите сделать доступной в программе, должна объявляться, как идентификатор PUBLIC, и ей должно соответствовать в программе описание external (внешняя).

  3. Соглашения по передаче параметров: для передачи параметров используется стек центрального процессора. Параметры всегда вычисляются и заносятся в стек в том порядке, в котором они указываются в описании подпрограммы, слева направо.

Параметры-значения

Параметр-значение – это параметр, значение которого не может изменяться подпрограммой, в которую он передается.

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

Параметры-переменные

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

  1. Обеспечение стека:

  1. RET N (где N - это число байт передаваемых, то есть занесенных в стек, параметров)

  2. Сохранить адрес возврата в регистрах (или в памяти) и извлечь параметры из стека поочередно.

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

PUSH BP

MOV BP, SP

PUSHA

POPA

POP BP

RET k

  1. Загрузка дальнего указателя: LDS reg,mem

Команда загружает операнд памяти (двойное слово) в регистр сегмента и в регистр-получатель.

{$L sum.obj}

Program abc;

Uses CRT;

Const n=20;

Type tm = Array[1..n] of integer;

Var A: tm; i, s :integer;

Procedure SUM (Var A: tm; k:integer; var s: integer);external;

Begin

Clrscr; Randomize;

For i:= 1 to n do begin

A[i]:= Random (100);

Write (A[i]:3);

End;

SUM(A,n,s);

Writeln;

Write(s);

Readkey;

End.

.286 ; указание типа процессора и набора команд

public sum

stack1 segment stack

db 128 dup (?)

stack1 ends

code segment byte public

assume cs:code, ss:stack1

sum proc near

push bp

mov bp,sp

pusha

lds si,[bp+10]

mov cx,[bp+8]

lds di,[bp+4]

mov ax,0

cycl: add ax,[si]

add si,2

loop cycl

mov [di],ax

popa

pop bp

ret 10

sum endp

code ends

end

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