Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебн пособ по арх и прогр МП.doc
Скачиваний:
64
Добавлен:
10.12.2013
Размер:
1.59 Mб
Скачать

13.6 Передача данных остальных типовPascal

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

Тип аргументов, передаваемых по ссылке, совпадает с типом ассемблера dword и с типом pointer в Pascal. По сути, это указатель из четырех байт на некоторый объект. Структура указателя обычная: два младших байта - смещение, два стар­ших байта - значение сегментной составляющей адреса. С помощью такого ука­зателя в программу на ассемблере передаются адреса следующих объектов:

всех аргументов, объявленных при описании в программе на Pascal: как var,

независимо от их типа;

аргументов pointer и longint;

строк string;

множеств;

массивов и 'записей, имеющих размер более четырех байтов. Аргументы по значению передаются следующим образом:

для типов char и byte - как байт;

для типа boolean - как байт со значением 0 или 1;

для перечисляемых типов со значением 0...255 - как байт; более 255 - как два байта;

для типов integer и word - как два байта (слово);

для типа real - как шесть байтов (три слова);

массивы и записи, длина которых не превышает четырех байтов, передаются

«как есть».

Заметим, что аргументы таких типов, как single, double, extended и comp, переда­ются через стек сопроцессора.

13.7 Возврат значения в программу наPascal

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

Возврат результата из процедуры на ассемблере в программу на Pascal:

Тип возвращаемого значения

Куда записать результат?

Байт

AL

Слово

AX

Двойное слово

DX:AX (старшее слово: младшее слово)

Указатель

DX:AX (сегмент: смещение)

В листинге 6 приведен текст вызывающего модуля на Pascal, а в листин­ге 7 - код вызываемого модуля на ассемблере. Программа на Pascal инициа­лизирует две переменные valuel и va1ue2, после чего вызывает функцию на ассемб­лере AddAsm для их сложения. Результат возвращается в программу на Pascal и присваивается переменной rez.

Вызывающая программа на Pascal (листинг 6).

{prg6.pas}

program prg6;

{внешние объявления}

function AddAsm:word; external;

{$L prg7.obj}

var

valuel: word; {здесь как внешние}

va1ue2: word;

rez: word;

begin

va1uel:=2;

va1ue2:=3;

{вызов функции}

rez:=AddAsm;

write1n( "Результат:",rez);

end.

Вызываемая процедура на ассемблере (листинг 7);

;prg7.asm

MASM

MODEL small

data segment word public ;сегмент данных

;объявление внешних переменных

extrn va1uel:WORD

extrn va1ue2:WORD

data ends ;конец сегмента данных

.code

assume ds:data ;привязка ds к сегменту

;данных программы на Pascal

main:

AddAsm proc near

PUBLIC AddAsm ;внешняя

mov cx,ds:va1uel ;va1uel в cx

mov dx,ds:va1ue2 ;va1ue2 в dx

add cx,dx ;сложение

mov ax,cx ;результат в ax, так как - слово

ret ;возврат из функции

AddAsm endp ;конец функции

end main ;конец программы

Как вы, наверное, обратили внимание, здесь была использована еще одна возмож­ность доступа к разделяемым данным — использование сегментов типа public. Совместное использование сегментов данных стало возможным бла­годаря тому, что компилятор Pascal создает внутреннее представление програм­мы в виде сегментов, как и положено для программ, выполняющихся на микро­процессоре Intel. Сегмент данных в этом представлении тоже имеет название data, и директива segment для него выглядит так: data segment word public и т. д.