Використання компілятора tasm

Як правило, цей варіант застосовується, коли та чи інша програма має великий розмір і її доцільно і написати, і скомпілювати окремо, використовуючи компілятор TASM. В цьому випадку можна використовувати всі можливості мови і компілятора TASM.

Основна програма, яка використовує підпрограму, написану на мові ас-семблера, містить ініціалізований масив, в якому буде визначатися максимальне число, а сама програма виводить на екран значення максимально-го числа з цього масиву:

Massiv: array [1..N] of integer = (1, 2, 3, 2, 10, 7, 2);

function Max (var Mas; N: integer); integer; external;

Wtiteln ( 'Максимальне число масиву одно:', Max (Massiv, N));

Використовуючи стандартну модель пам'яті, підпрограму, яка визначає максі-мальное число з масиву, можна написати так:

Model Small, PASCAL

У розглянутому прикладі повертається параметр типу integer, і він повертається в регістрі AX.

У підпрограмі, написаної на мові асемблера, можна використовувати підпрограми, написані на мові Паскаль. Кілька модифікована підпрограма визначення максимального елемента масиву, яка в разі неприпустимого елемента масиву (0 або негативне число) викликає підпрограму, написану на мові Паскаль для видачі повідомлення.

Massiv: array [1..N] of integer = (1, 2, 3, 2, 10, 7, 2);

function Max (var Mas; N: integer); integer; external;

procedure ErrorReport (N: integer);

Перед зверненням до підпрограми, написаної на мові Паскаль, в стек у відповідному порядку слід помістити передані параметри. В даному випадку такий параметр один - число елементів масиву.

Так як підпрограма, написана на мові Паскаль, не гарантує збереження регістрів AX, BX, CX і DX, то в разі необхідності збереження їх значень слід перед зверненням до підпрограми, написаної на мові Паскаль, зберегти в стеці значення відповідних регістрів, а після повернення з підпрограми - відновити їх. В даному прикладі зберігається вміст регістра BX, в якому записано мінімальне число.

Використання вбудованого асемблера

Так само як і Turbo assembler, вбудований асемблер передбачає використання ряду зумовлених стандартних ідентифікаторів, що мають спеціальне призначення. Якщо в програмі буде введений ідентифікатор з таким же ім'ям, але має інше призначення, в частинах програми, написаних на вбудованому асемблері, буде віддано перевагу стандартному призначенням цього ідентифікатора.

Поряд з можливістю використання ідентифікаторів мови Паскаль, вбудований асемблер використовує три додаткових ідентифікатора:

@Code - поточний кодовий сегмент (використовується тільки з оператором SEG);

@Data - поточний сегмент даних (використовується тільки з оператором SEG);

@Result - результат, отриманий функцією (можна використовувати тільки всередині функції).

При використанні вбудованого асемблера можна використовувати:

- стандартні процедури і функції;

- спеціальні масиви Mem, MemW, MemL, Port і PortW;

- константи типу string, речових типів і типу-множини;

- процедури та функції, оголошені до директиви inline;

- мітки, оголошені не в цьому блоці.

Частина програми, написана на мові асемблера, поміщається в операторні дужки asm. end.

Massiv: array [1..N] of integer = (1, 2, 3, 2, 10, 7, 2);