logo
ООП для Заоч / Пинчук Лозовская Программир на С

12.1. Засоби використання асемблера

Незважаючи на переваги мов програмування високого рівня (таких як С та С++), мова асемблера продовжує грати значну роль у сучасному програмуванні. Тільки за допомогою асемблера програміст може спілкуватися з комп’ютером на його власній мові - мові процесору, яку часто називають машинною мовою або машинним кодом. Сучасні оптимізуючі компілятори для мови С++ дозволяють отримувати досить ефективний і компактний виконуваний код, але, навіть у цьому випадку, застосування мови асемблера може суттєво його покращити. Вдале застосування мови асемблера дозволяє:

- оптимізувати окремі критичні місця у програмі, від яких найбільше залежить її робота;

- отримати доступ до обладнання та пристроїв на рівні регістрів та окремих бітів;

- створювати та застосовувати програми обробки переривань.

Оболонка Borland C++ пропонує три варіанти застосування мови асемблера:

- текст програми на С++ можна компілювати у текст на асемблері;

- можна вставляти у програму асемблерні коди у вигляді asm-послідовностей;

- можна створювати зовнішні модулі за допомогою компілятора Tasm (Turbo Assembler) і далі, за допомогою компоновника, приєднувати їх до програми.

Компіляція програми у асемблерний текст

Компіляція програми С++ у асемблерний текст виконується за допомогою командного рядка. Нехай вихідна програма на С++ має ім’я "myprog.cpp". Тоді треба ввести такий командний рядок:

bcc32 -S myprog

Тут bcc32 - це ім’я компілятора (повне ім’я bcc32.exe), -S є ключ, завдяки якому компілятор створює файл з ім’ям myprog.asm, що буде вміщувати асемблерний код програми.

Після отримання асемблерного коду його можна проглянути і, при необхідності, відредагувати. Це дозволяє виконувати низькорівневу оптимізацію програми у "ручному" режимі. Після цього компілювання програми можна завершити шляхом введення такого командного рядка:

bcc32 myprog.asm

При виконанні останнього командного рядка компілятор bcc32.exe викликає компілятор tasm32, а після отримання об’єктного коду викликається компоновник link32.exe, який завершує процес компіляції з формуванням виконуваного коду програми у вигляді файлу myprog.exe. Для того, щоб бути впевненим, що такий процес спрацює, треба перевірити, щоб каталог ..\BIN системи Borland C++ містив у собі компілятор асемблеру tasm32.exe. При відсутності цього файлу, його треба скопіювати із системного диска TASM у каталог ..\BIN.

Для аналізу окремих компонентів програми можна компілювати у асемблерний код не цілком всю програму, а окрему її функцію.

Оператори asm

Оператори asm дозволяють вставляти асемблерний код прямо у потік коду поточної функції. Використовуються два види оператору asm: простий і складений. У випадку простого оператора після службового слова asm записуємо одну асемблерну команду (після неї, далі можна записати коментар), наприклад:

asm mov AX, CX ; встановити ax у значення cx

Однорядковий коментар записується після символу "; ".

Складений оператор asm має тіло, яке записується у фігурних дужках. Воно може вміщувати довільну послідовність команд асемблера. Наприклад:

asm { push BP

mov BP, SP

..........

pop BP

}

У тілі оператору asm у одному рядку можна записувати декілька асемблерних команд, розділяються вони крапкою з комою. Наприклад:

asm { push AX; push BX; push CX; push DX

.................................

pop DX; pop CX; pop BX; pop AX

}

У асемблерних командах asm-послідовності у якості операндів можна застосовувати імена змінних, що об’явлені вище, наприклад:

short alfa, beta;

asm { mov AX, alfa

mov BX, beta

...........

}

Оператори asm звичайно пишуться у тілі деякої функції. У такому разі відповідний код вставляється у поточну точку коду функції. Але asm-оператор можна записувати й на глобальному рівні, тоді відповідний йому код буде розміщено у сегменті даних програми.

Формально asm-послідовність є оператор. Компілятор попереджає більшість конфліктів між вбудованими у asm-оператор командами асемблеру та сусідніми з ними виразами С++.

У наведеній нижче програмі для виконання операції обміну значеннями змінних alfa, beta використовується асемблерний код.

// Приклад 1

#include <syst.h>