Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
M1_3spCP.doc
Скачиваний:
5
Добавлен:
18.09.2019
Размер:
161 Кб
Скачать
☆

2. Використання імен даних, їх структур та полів у вставках на мові асемблера

При використанні вставок на мові Асемблер для доступу до даних можуть використовуватись або явні адреси, як у відновленому тексті на мові асемблера, або безпосередньо імена використані у мові високого рівня.

Організація вставок на мові Асемблера

При вставках на мові Асемблера текст коду включається в блоки вигляду:

_asm{

...

}

Приклад: якщо для змінних або аргументів a, b, c, описаних на мові С типом short потрібно реалізувати вираз

c = a * b – c;

то вставка може мати вигляд:

_asm{

mov ax,a ; Завантаження a в акумулятор

imul b ; Додавання b в акумулятор

sub ax,c ; Віднімання c з акумулятора

mov c,ax ; Збереження c з акумулятора

}

Для цілих даних без знака типа unsigned відповідна вставка нічим не відрізняється від попередньої, але при вставках слід додержувати відповідність розміру регістрів довжині типу даних у мові C. При використанні операцій множення для цілих даних (mul – без знака і imul – зі знаком) слід враховувати, що переший аргумент знаходиться в акумуляторі (al – для однобайтних даних, ax – для двобайтних даних або eax - для чотирибайтних даних), добуток формується в розширеному акумуляторі (ax – для однобайтних даних, (dx, ax) – для двобайтних даних або (edx, eax) - для чотирибайтних даних) і займає вдвічі більше місця ніж аргументи. При одержанні результатів цілого ділення та залишку (командами div – без знака і idiv – зі знаком) перший аргумент повинен бути розміщений в регістрах ax, (dx, ax) або (edx, eax), частка формується в основному акумуляторі ax, ax або eax, а залишок – в розширенні акумуляторів al, dx або edx.

При роботі з даними з плаваючою точкою дії виконуються в регістрах з плаваючою точкою. Приклад вставки для того самого виразу з даним з плаваючою точкою типів float або double матимуть вигляд:

_asm{

fld a ; Завантаження a у верхівку стека регістрів st

fmul b ; Додавання b у верхівку стека регістрів st

fsub c ; Віднімання c з у верхівки стека регістрів st

fst c ; Збереження c з у верхівки стека регістрів st

}

Для зміни поточних розмірів даних в аргументах машинних команд, розміщених в пам’яті, вико­ри­сто­ву­ється операції перевизначення розмірів: byte ptr – для даних розміром в байт (типи char, unsigned char), word ptr – для даних розміром в слово (типи short, unsigned short), dword ptr – для даних розміром в подвійне слово (типи int, unsigned int, unsigned, long, unsigned long, float), qword ptr – для даних розміром в чотири слова (типи _int64, double) і tbyte ptr – для даних розміром в десять байтів (тип long double). При необхідності задавання індексації або базування опе­ранда команди одним або двома базовими регістрами викори­стову­ють­ся позначення регістрів в квадратних дужках: [eax], [ebx], [ecx], [edx], [esi], [edi], [ebp], [esp], до одного з яких можна дописати масштабний множник *2, *4 або *8 залежно від кількості байтів в елементі масива. При необхідності задавання префікса зміни сегмента перед операндом або його частиною задаються імена сегментних регістрів з двокрапкою: ds:, cs:, ss: es:, fs: і gs:.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]