Ассемблер + Pascal



Дата04.03.2016
өлшемі41.5 Kb.
#41018
түріЛабораторная работа
ЛАБОРАТОРНАЯ РАБОТА N 13

Ассемблер + Pascal

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



  • большой объем занимаемой памяти, недостаточное быстродействие,

  • недоступны внутренние ресурсы компьютера.

Тогда рационально переписывать не всю программу на языке высокого уровня, а только несколько фрагментов кода, критичных, например, по времени выполнения. И наоборот, существует много библиотек, написанных на языках высокого уровня, которые с успехом могут применяться в ассемблерных программах. Для объединения текстов программ, написанных на Pascalе и Aссемблере, когда подпрограмма на языке ассемблера вызывается из основной программы на языке Pascal, возможны два варианта:

  1. Подпрограмма записывается на языке ассемблера. Компилируется компилятором Tasm. Получаемый объектный файл компонуется с основной программой, написанной на Turbo Pascal.

  2. Используя встроенный ассемблер пакета Turbo Pascal, отдельные части текста программы можно написать непосредственно на языке ассемблера, заключив их в операторные скобки asm ... end.

Вариант 1

Рекомендуется использовать, когда функция или подпрограмма достаточно большая, и имеет смысл ее компилировать отдельно. Либо в ней нужно использовать инструкции, недопустимые для встроенного в Pascal ассемблера. Для реализации этого варианта необходимо выполнить следующие требования :
1. В Pascal-программе использовать директиву компилятора { $L <имя .obj-файла> }, где .obj-файл - это оттранслированная программа на языке ассемблера, которая вызывается из Pascal-программы.
2. В Pascal-программе подпрограмма, которая реализована на ассемблере, описывается как external и вызывается как обычная функция, написанная на языке Pascal.
3. В ассемблер-программе используется директива PUBLIC, чтобы указать, что процедура, реализуемая в этой программе, может использоваться во внешних по отношению к ней программах.

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

Правила передачи параметров из Pascal в ассемблер:


  • параметры-значения размером в 1 байт передаются одним словом;несет информацию младший байт.

  • параметры-значения размером в 2 байта передаются одним словом;

  • параметры-значения размером в 4 байта передаются двумя словами;

  • все остальные параметры-значения передаются полными адресами;

  • параметры-переменные и параметры-константы передаются полными адресами.

5. Результаты работы ассемблерной программы записывают в регистры AX (или AX,DX), если в Pascal она объявлена как функция. Правила передачи параметров из функции, т.е. из ассемблера в Pascal:




  • однобайтовый результат передается в регистре AL;

  • слово-результат передается в регистре AX;

  • 4-байтовый результат передается в регистрах DX (старшая часть или адрес сегмента) и AX (младшая часть или смещение).

Если подпрограмма на ассемблере должна вычислять множество значений, например массив, то их нужно объявлять в модуле на Pascale, передавать в ассемблер адрес начала этого множества. Тогда после вычислений на ассемблере в массиве основной программы на языке Pascal будут требуемые значения.
Пример

Составить программу, использующую функцию для вычисления суммы элементов массива целых чисел. Функция записывается на языке Ассемблера.


Основная программа на Pascalе.

Program P_ass1;

const n=10;

var M:array [1..n] of integer;

i: integer;

{$L ass1_p} { подключение файла ass1_p.obj }

function sm (var masiv; n:integer):integer;external;

begin


writeln ('Введите 10 чисел');

for i:= 1 to n do

readln (m[i]);

writeln ('сумма элементов массива:',sm(M,n));

readln;

end.


Вызываемая программа на Ассемблере в отдельном файле.

.Model Large, Pascal

.CODE

Public sm



sm proc near adrm:dword,n:word ; передаваемые параметры

lds si,adrm ; загрузка адреса массива в ds,si

mov bx,0 ; начальное значение суммы

mov cx,n ; счетчик

cld ; обработка строки слева направо - DF=0

@@1:lodsw ; загрузка слова в ax, адрес из ds:si

add bx,ax

loop @@1

mov ax,bx ; результат работы функции

ret


endp

.exit 0


end

Встроенный Ассемблер

Начиная с версии 6.0, Turbo Pascal содержит встроенный ассемблер. Он позволяет включать в программу фрагмент текста на языке Ассемблер в операторных скобках asm...end; . После заголовка ассемблерной функции или подпрограммы необходимо написать служебное слово "assembler". При этом в ассемблерной части программы можно использовать идентификаторы из программы на языке Pascal.

В ассемблерной части нельзя использовать:



  • стандартные процедуры и функции;

  • метки, объявленные не в данном блоке и др.

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

  • локальными, т.е. начинаться с символа "@".

Пример


Запишем функцию Sm из предыдущего примера на языке Ассемблер внутри программы на Pascalе.
Program p_ass3;

const n=10;

var M:array[1..n] of integer;

s,i,b : integer;

function Sm (var Mas;n:integer):integer;assembler;

asm


lds si,mas {адрес массива}

mov bx,0

ov cx,n

cld


@1:lodsw

add bx,ax

loop @1

mov ax,bx

add ax,b {прибавляется число, объявленное в Pascal - b}

end;


begin

writeln ('Введите начальное приращение');

readln (b);

writeln ('Введите 10 чисел');

for i:= 1 to n do

readln (m[i]);

writeln ('Сумма элементов массива :',sm(m,n));

readln;


end.

Задания к лабораторной работе

1. В соответствии с заданием к лабораторной работе N 10 ычисления y1 и y2 запрограммируйте на языке ассемблера, вычисление y – на языке Pascal. Для вычисления y1 создайте отдельный файл на языке Ассемблера, для вычисления y2 используйте встроенный Ассемблер (конструкция asm...end).



2. Занесите в протокол:

  • исходные данные и полученные результаты вычислений в десятичной форме;

  • текст программ и описание способов вызова процедур и передачи параметров.


Достарыңызбен бөлісу:




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет