Page 34 - 4989
P. 34
асемблерні вставки всередині коду на С++. Синтаксис таких
вставок залежить від компілятора. Розглянемо, як реалізувати
асемблерну вставку для компілятора Microsoft, що
використовується середовищем Microsoft Visual Studio.
У поточній версії Microsoft Visual Studio асемблерні вставки
підтримуються лише для 32-розрядної платформи Win32 (не
підтримуються для х64).
Асемблерна вставка оформлюється за допомогою ключового
слова __asm. Якщо вставка містить лише одну інструкцію, вона
просто наводиться одразу після ключового слова __asm.
Наприклад:
__asm mov eax,0
Якщо вставка містить більше однієї інструкції, слід
використовувати фігурні дужки на початку та в кінці вставки.
Наприклад:
__asm
{
mov eax, 0
cpuid
}
Асемблерні команди всередині вставки записуються згідно із
синтаксисом Intel. Зокрема, шістнадцяткові числа записуються з
суфіксом «h», а двійкові з суфіксом «b», наприклад:
__asm mov eax, 0Аh
__asm mov eax, 1010b
В асемблерній вставці можна звертатися до тих змінних, в
область видимості яких вона входить. Якщо інструкція має два
операнди, то тип змінної повинен узгоджуватись по розрядності з
другим операндом. Наприклад, операндами інструкції пересилки
даних можуть бути змінна типу int та 32-розрядний регістр (напр.
еах), або змінна типу short та 16-розрядний регістр (напр. ах).
Можна звертатись до елементів масиву з таким же синтаксисом,
як у С++ (з зазначенням індекса в квадратних дужках).
Покажчики можна заносити лише в 32-розрядні регістри. Якщо
необхідно завантажити в регістр початкову адресу масиву чи
змінної, слід використовувати інструкцію lea.
Приклад:
int x;
34