Хід отримання результатів

Нижче наведена довідкова інформація, необхідна для забезпечення виконання індивідуального завдання в даній лабораторній роботі.

7.4.1. Безпосередньо в програмі на мові Pascal можна записувати асемблерний код шляхом використання асемблерних вставок.

7.4.2. Кожна асемблерна вставка має виглядати так:

 

asm

< сукупність команд на асемблері >

end;

Наприклад:

 

if a < b then

asm

mov ah, a

end

else

asm

mov ah, b

end;

 

У рядку, де записана команда, можна використати коментарі.

Наприклад:

 

asm

mov ax, 1 { (ax) = 1 }

mov cx, 100 { (cx) = 100 }

end;

 

7.4.3. У кожній команді на асемблері присутні код операції і, у більшості випадків, один або два операнди. В командах на асемблері можуть бути, зокрема, використані як операнди регістри центрального процесора. Зарезервовані імена деяких регістрів центрального процесора такі:

 

16-бітові регістри загального призначення (РЗП) AX, BX, CX, DX

8-бітові регістри (молодша частина РЗП) AL, BL, CL, DL

8-бітові регістри (старша частина РЗП) AH, BH, CH, DH

16-бітові вказівні та індексні регістри SP, BP, SI, DI

16-бітові сегментні регістри CS, DS, SS, ES

16-бітовий вказівник команд IP

16-бітовий регістр ознак (без імені)

 

7.4.4. У групу 16-бітових регістрів загального призначення входять регістри AX, BX, CX і DX. Їх особливість полягає в тому, що допускається окремо вказувати їхні старші (H) і молодші (L) байти. Індексні регістри SI і DI часто використовують для адресації даних, які розміщені в пам’яті. Під час виконання програми процесор може звертатись до чотирьох сегментів, базові адреси яких знаходяться в сегментних регістрах CS (коду), DS (даних), SS (стека) і ES (додаткових даних). Регістр CS вказує на початок поточного сегмента коду, тобто програми, звідки вибираються команди для виконання. Регістр SS адресує початок поточного сегмента стека, в якому реалізуються всі стекові операції. Регістр DS визначає поточний сегмент даних, який містить значення змінних. Регістр ES вказує на додатковий сегмент, який звичайно використовується для зберігання даних. Вказівник команд IP здійснює адресацію усередині поточного сегмента коду. Він вказує на ту команду, яка буде вибрана під час чергового звертання до кодового сегмента. Команди завжди вибираються із поточного кодового сегмента – логічна адреса знаходиться в регістрах CS:IP. Стекові операції завжди виконуються шляхом звертання до поточного сегмента стека – логічна адреса міститься в регістрах SS:SP. Змінні звичайно знаходяться в поточному сегменті даних, на нього вказує регістр DS.

Наприклад, виконуючи команду mov AX,[DI], процесор буде звертатись до поточного вмісту регістра DS.

7.4.5. У демонстраційній програмі використані команди: MOV, ADD, SUB, PUSH і POP.

Команда MOV забезпечує, зокрема, передачу значень з регістра в регістр або пам’ять, а також із пам’яті в регістр:

1) MOV DS, AX – переслати (AX) в DS

2) MOV [BX],DX – переслати (DX) в комірку пам’яті, яка адресована (BX)

3) MOV BX,[DI] – переслати вміст із комірки, яка адресована (DI), в регістр BX

Примітка: якщо ім’я регістра вказано в круглих дужках, то вони ототожнюються зі словом “вміст”. Наприклад, (AX) означає “вміст регістра AX”.

 

 

Команди додавання ADD і віднімання SUB мають кожна такий формат:

 

ADD <операнд 1>, <операнд 2>

SUB <операнд 1>, <операнд 2>

 

Вони виконують операцію додавання і відповідно віднімання так:

 

<операнд1> := <операнд1> + <операнд2>

<операнд1> := <операнд1> – <операнд2>

 

Команда PUSH заносить у стек значення, команда POP забирає із стека занесене туди раніше значення. В обох командах використовується тільки один операнд. Це може бути безпосереднє числове значення, вміст регістра чи змінної або зміщення змінної в сегменті.

7.4.6. Один із варіантів обчислення адреси операнда, розміщеного в оперативній пам’яті, полягає в тому, що вміст сегментного регістра, помножений на 16, додається до 16-бітового зміщення. Таким чином,

 

<фізична адреса> = <вміст сегментного регістра> * 16 + <зміщення>

 

Крім терміна “зміщення”, використовують також терміни “абсолютна адреса” або “виконавча адреса”.

Можна використовувати різні варіанти розміщення в команді відомостей про операнди, тобто існують різні способи адресації операндів. У демонстраційній програмі використані:

· Регістрова адресація – операнд вибирається із регістра або завантажується в регістр. Наприклад, MOV AX, CX.

· Безпосередня адресація – як операнд-джерело використовується константа. Наприклад, MOV AX, 500.

· Пряма адресація – виконавча адреса є складовою частиною команди, як один з операндів може слугувати ім’я змінної. Наприклад, MOV AH, Y.

· Непряма регістрова адресація – виконавча адреса міститься в базовому регістрі (BX), регістрі-вказівнику (BP), індексному регістрі (SI чи DI) або в їх комбінації. Можуть бути також числові доданки. Наприклад, MOV AX,[SI]; MOV DI, OFFSET X; MOV [BX+DI], AX; ADD DX, [SI+4]; MOV CX, [BP+6].

· Базова адресація – виконавча адреса обчислюється шляхом додавання до вмісту базового регістра BX числового значення. Наприклад, MOV BX,

OFFSET Array;

MOV AX, [BX + 2].

 

7.4.7. Функція GetMem(). Ця функція створює нову ділянку в пам’яті, (вказаного під час виклику цієї функції розміру), яка динамічно виділяється, і розміщує адресу виділеної ділянки в змінній-вказівнику.

Опис функції: GetMem (var p:pointer; <розмір>:word).

Параметр р являється змінною-вказівником. Параметр <розмір> має довжину в слово і задає розмір (в байтах) ділянки пам’яті, що динамічно виділяється. На заново створену ділянку пам’яті можна посилатися за допомогою вказівника p.