Умовні та безумовні переходи
Отже, ми вже можемо писати найпростіші вставки на Асемблері. Зараз ми розглянемо умовні та безумовні переходи (аналогічно if-then-else, goto в Паскалі). Слід враховувати, що будь-які переходи в програмі уповільнюють виконання програми (зазвичай для виконання переходу потрібно 5 тактів ЦП, а іноді і більше). У сучасних процесорах для підвищення тактової частоти використовується конвейеризация. Справа в тому, що для обслуговування кожної команди процесора потрібно кілька тактів: перший такт розпізнає команду, інший виконує, третій робить ще що-небудь, четвертий. У сучасних процесорах поки розпізнається одна команда, одночасно виконується інша, щось робиться з третьою, четвертою, і так далі. При появі в програмі умовного переходу процесор завантажує в конвеєр дані, починаючи з того місця, куди на його думку, призведе перехід. У разі невдалого передбачення переходу все команди поточного конвеєра повинні виконатися, потім конвеєр скинутися, виконатися умовний перехід, і тільки потім конвеєр буде завантажуватися знову. Зрозуміло, що це погано впливає на ефективність. Адже по суті після невдалої спроби здійснити перехід за одиницю часу обробляється менше число команд. До того ж в конвеєр завантажуються непотрібні дані. Чим довше конвеєр у процесора, тим швидше він може виконувати програми, а й тим більше втрати при невдалому переході. Тобто при однаковій частоті ЦП краще той, у якого коротше конвеєр. Слід розуміти, що всюди, де можна обійтися без переходів, краще без них обходитися. Наприклад, краще використовувати команди типу cmpxchg. ніж cmp з умовними переходами. У цьому випадку блок ЦП, який відповідає за передбачення переходів не буде задіяно (що знизить ймовірність простою). Але без команд переходів наші можливості дуже обмежені, тому варто їх розглянути (насправді, вони використовуються часто-густо, особливо компиляторами!) Команди передачі управління
1) jmp мітка - безумовний перехід на мітку. Наприклад: jmp @exit; Використовується дуже часто. По суті виконує те ж саме діяння, що і goto в Паскалі
2) jcc мітка (jcc - одна з команд в наступній таблиці) - умовний перехід. Перехід виконується, якщо відповідне умова виконана. Реально кожна умова є будь-яким станом прапорів. Зазвичай перед командою умовного переходу виконується команда cmp. хоча це зовсім не обов'язково. У наведеному нижче прикладі ми хочемо знайти модуль числа eax:
nbspnbsp cmp eax, 0;
nbspnbsp jge @NoNEG;
nbspnbsp neg eax;
@NoNEG:
Якщо ви розберетеся з прапорами. і зрозумієте, які прапори реально змінює кожна команда, то зможете писати умовні переходи, наприклад, після команди dec. Це іноді дозволяє отримати певний виграш в продуктивності. Команди умовного переходу:
Умова для CMP
Умова для CMP
якщо вище або дорівнює
якщо немає переносу
якщо більше або дорівнює
якщо нижче
якщо перенесення
якщо нижче або дорівнює
якщо менше або дорівнює
якщо одно
якщо нуль
якщо не дорівнює
якщо не нуль
якщо є переповнення
якщо немає переповнення
якщо є парність
якщо немає парності