Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Связь ассемблера с ЯВУ

По дисциплине

«Связь ассемблерных модулей с программами на языках высокого уровня»

 

 

Выполнил: Феми-Оке Антони.
Группа №1303

Факультет КТИ

Преподаватель: Лавров А.А.

 

 

Санкт-Петербург

1) Задание:

Вариант №11

На языке высокого уровня (Pascal или С) генерируется массив псевдослучайных целых чисел, изменяющихся в заданном диапазоне и имеющих равномерное или гауссовское (ограниченное интервалом [Mx-3*S,Mx+3*S]) распределение. Необходимые датчики псевдослучайных чисел находятся в каталоге RAND_GEN (пpи его отсутствии получить у пpеподавателя).

Далее должен вызываться ассемблерный модуль(модули) для формирования распределения количества попаданий псевдослучайных целых чисел в заданные интервалы. В общем случае интервалы разбиения диапазона изменения псевдослучайных чисел могут иметь различную длину.

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

 

Исходные данные:

1. Длина массива псевдослучайных целыхчисел - NumRanDat (<= 16K)

2. Диапазон изменения массива псевдослучайных целых чисел

[Xmin, Xmax]

3. Количество интервалов, на которые разбивается диапазон

изменения массива псевдослучайных целых чисел - NInt ( <=24 )

4. Массив левых границ интервалов разбиения LGrInt

(должны принадлежать интервалу [Xmin,Xmax])

 

Результаты:

1. Текстовый файл, строка которого содержит:

- номер интервала,

- левую границу интервала,

- количество псевдослучайных чисел, попавших в интервал.

Количество строк равно числу интервалов разбиения.

2. График, отражающий распределение чисел по интервалам.

(необязательный результат)

 

Для бригад с нечетным номером: подпрограмма формирования распределения количества попаданий псевдослучайных целых чисел в заданные интервалы реализуется в виде одного асемблерного модуля, сразу получающего требуемое распределение и возвращающего его в головную программу, написанную на ЯВУ.

2) Общие сведения:

Связь ассемблера с ЯВУ.

Существует соглашения для связи ассемблера с каждым из языков. Здесь есть свои особенности.

1. Способ передачи управления (тип вызова). В Pascal, если ассемблеровская процедура описана в основной программе или в implementation, то она вызывается как NEAR; при описании в interface–вызов FAR.

2. Сегментация и модели памяти. Если выбрана модель .LARGE, то стек надо описывать как .FARSTACK и он уже не будет относиться к группе DGROUP.

3. Особенности описания общих и предопределенных переменных. В Pascal ограничений нет, но рекомендуется начинать переменные с заглавной буквы; в С-переменных необходимо начинать с символа подчеркивания «_»

4. Управление регистрами. DS – нужно следить за ним. РОН нужно сохранять или в головной программе, или в процедуре на ассемблере.

5. Способы передачи параметров. Как правило, параметры передаются через кадр стек, размещение параметров идет в различном порядке.

6. Способ возвращения результата. Возвращение результатов может быть реализовано через стек, AX (BYTE, WORD), DX:AX (DWORD), ST(0) – вершина стека x87 (FLOAT).

7. Способ восстановления стека. Pascal – в вызываемой программе, в С – вызывающей программе (для возможности оптимизации)

8. Способы задания и вызова ассемблерного модуля:

а) Раздельная компиляция. Модули на различных языках компилируются отдельно и в вызывающем модуле указан специальный оператор описания модуля на другом языке и его загрузки в виде объекта файла.

б) Встроенная компиляция. Фрагмент или команда ассемблера указывается как встроенный оператор, и сам компилятор вызывает ассемблерный транслятор автоматически.

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

3) Текст программы:

program lab6;

 

uses

crt;

 

var

LengthMass, RangeMin, RangeMax, IntervalCount: Word;

LeftBorders, RandomMass, Res: array[1..255] of byte;

i: Integer;

f: Text;

 

begin

clrscr;

writeln(' Лабораторная работа №6');

writeln(' Феми-Оке Антони гр.1303 вар №11');

write('Длина массива псевдослучайных чисел: ');

readln(LengthMass);

writeln('Диапозон изменения:');

write('от ');

read(RangeMin);

write(' до ');

readln(RangeMax);

write('Количество интервалов: ') ;

readln(IntervalCount);

writeln('Массив левых границ(',IntervalCount,'):');

for i:=1 to IntervalCount do

begin

write(i,') ');

readln(LeftBorders[i]);

end;

Randomize;

writeln('Массив псевдослучайных целых чисел:');

for i:=1 to LengthMass do

begin

RandomMass[i]:=random(RangeMax-RangeMin+1)+RangeMin;

write(RandomMass[i],' ');

end;

readln;

asm

xor di,di

mov dx,IntervalCount

mov cx,LengthMass

@NextVal: {очередное значение массива}

xor si,si

xor ax,ax

mov ah,byte ptr RandomMass[di] {текущее значение}

@Interval: {Интервал}

cmp si,dx

jg @break {Если последний интервал, то выходим из цикла}

mov al,byte ptr LeftBorders[si] {значение границы}

cmp ah,al {Сравнение}

inc si

ja @Interval {Если значение больше, то переходим к след. итеррации}

@break:

inc byte ptr Res[si-2]

inc di

loop @NextVal {След. значение}

end;

writeln('Частотное распределение чисел по интервалам:');

write('№ интервала');

write(' Левая граница');

writeln(' Кол-во попаданий');

for i:=1 to IntervalCount do

begin

write(' ',i,') ');

write(' ',LeftBorders[i]);

writeln(' ',Res[i]);

end;

readln;

Assign(f,'Out.txt');

Rewrite(f);

for i:=1 to IntervalCount do

begin

write(f,i,') ');

write(f,LeftBorders[i],' ');

writeln(f,Res[i]);

end;

Close(f);

end.

4) Вывод:

Выполнив данную лабораторную работу мы научились связывать языки высокого уровня с ассемблером.

 

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.