Як правило, цей варіант застосовується, коли та чи інша програма має великий розмір і її доцільно і написати, і скомпілювати окремо, використовуючи компілятор 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);