Розділ 1: Регістри і параметри p>
1.1 Використання регістрів p>
У створюваних асемблерних програмах можна використовувати всі регістрипроцесора. Але щоб запобігти плутанину з функціями С і С + +, необхідновідновлювати bp, cs, sp і ss, які вони мали до запуску створеноїпідпрограми. Тоді можна бути абсолютно впевненим, що звернення до іншихфункцій не змінить ці регістри. Також не можна забувати, що С використовуєрегістри si і di для реєстрових змінних, тому при використаннівбудованого асемблера сповільнюється спільна робота програми. p>
До регістрів ax, bx, cx, dx і es можна звертатися вільно і не потрібнорезервувати їх значення до закінчення підпрограми. Ця свобода стосується іінших функцій, тому треба пам'ятати, що ці регістри змінюватися, якщовикликаються функції С та С + + з асемблерних підпрограм. p>
1.2 асемблерні оператори Inline p>
асемблерні оператори inline починаються словом asm, за якимслід інструкція і її операнди. Наприклад, щоб синхронізуватипрограму із зовнішнім сигналом переривання, можна написати: p>
/* очікування переривання */asm sti asm hlt printf ( "Переривання полученоn") p>
Коли ранні версії Turbo C компілюють програму з вбудованимикомандами asm, компілятор спершу створює асемблерні текст для всієїпрограми, вставляючи в текст наші асемблерні інструкції разом звідкомпілювалися кодом для інших операторів С. Потім компіляторвикликає Turbo Assembler та Linker (компонувальник), щоб провестиассемблірованіе і підключити програму до кінцевого файлу коду. Більшепізні версії Turbo і Borland C + + можуть компілювати оператори asm безвиклику TASM. Повний синтаксис asm: asm [позначка] Мнемоніка/директива операнди [;] [/ * З коментар */] p>
Крапки з комами в кінці рядків asm і коментарі С, розташованіміж/* і */видаляються з тексту перед ассемблірованіем, тому їх можнаопускати в тексті програми. p>
1.3 Розміщення даних і операторів у тексті програми p>
Кожен рядок тексту програми С і С + + знаходиться або всередині, абозовні функції, і оператори asm можуть вставлятися як в одному, так і віншому місці. Конкретне положення оператора asm впливає на те, кудиассембліруется код або директива. Якщо оператор asm з'являється зовніфункції, то він ассембліруется в сегмент даних програми, якщо всерединіфункції - в кодовий сегмент. Зазвичай, щоб створити змінні, операториasm вставляються зовні функцій; для створення коду їх слід вставлятивсередину функцій. Наприклад: asm count db? int main () p>
(asm shl [count], 1/* множення count на 4 */asm shl [count], 1 return 0; p>
) p> < p> Змінна count оголошується в сегменті даних програми
(щодо ds). Оператори усередині функції main множать count на 4,використовуючи замість mul швидкі дії зсуву shl. Якщо оголошуватизмінні всередині функції, дані ассембліруются в кодовий сегмент, вимагаючиособливого поводження: int main () p>
(asm jmp OverThere asm count db? p>
OverThere: asm shl [count], 1/* множення count на 4 */asm shl [count ], 1 return 0; p>
) p>
Оскільки тепер мінлива count знаходиться в кодовому сегменті,потрібна інструкція jmp, щоб уникнути випадкового сприйняття значенняcount як машинного коду та його виконання. p>