Команда безумовного переходу jmp
Синтаксис команди безумовного переходу jmp [модифікатор] адреса_переходу - безумовний перехід без збереження інформації про точку повернення.
Адреса_переходу являє собою адресу у вигляді мітки або адресу області пам'яті, в якій знаходиться покажчик переходу.
Всього в системі команд мікропроцесора є кілька кодів машинних команд безумовного переходу jmp. Їх відмінності визначаються дальністю переходу і способом завдання цільової адреси.
Дальність переходу визначається місцем розташування операнда адреса_переходу. Ця адреса може знаходитися в поточному сегменті коду або в деякому іншому сегменті. У першому випадку перехід називається внутрішньосегментним, або близьким, у другому міжсегментним, або дальнім. Внутрішньосегментний перехід припускає, що змінюється тільки вміст регістра eip/ip.
Можна виділити три варіанти внутрішньосегментного використання команди jmp:
прямий короткий;
прямий;
непрямий.
2. Процедури
У мові асемблера є декілька засобів, які вирішують проблему дублювання ділянок програмного коду. До них відносяться: • механізм процедур;
• макроассемблер;
• механізм переривань.
Процедура, часто звана також підпрограмою, - це основна функціональна одиниця декомпозиції (розділення на кілька частин) деякої задачі. Процедура являє собою групу команд для вирішення конкретної підзадачі і володіє засобами отримання управління з точки виклику завдання більш високого рівня і повернення управління в цю точку.
У простому випадку програма може складатися з однієї процедури. Іншими словами, процедуру можна визначити як правильним чином оформлену сукупність команд, яка, будучи одноразово описаною, за необхідності може бути викликана в будь-якому місці програми.
Д ля опису послідовності команд у вигляді процедури в мові асемблера використовуються дві директиви: PROC і ENDP. Синтаксис опису процедури такий (рис. 12.1).
Рис. 12.1. Синтаксис опису процедури в програмі
З рис. 12.1 видно, що в заголовку процедури (директиві PROC) обов'язковим є тільки завдання імені процедури. Серед великої кількості операндів директиви PROC слід особливо виділити [відстань]. Цей атрибут може набувати значення near або far і характеризує можливість звернення до процедури з іншого сегмента коду. За умовчанням атрибут [відстань] приймає значення near.
Процедура може розміщуватися в будь-якому місці програми, але так, щоб на неї випадковим чином не потрапило управління. Якщо процедуру просто вставити в загальний потік команд, то мікропроцессор сприйматиме команди процедури як частину цього потоку і відповідно буде здійснювати виконання команд процедури.
3. Умовні переходи
Мікропроцесор має 18 команд умовного переходу. Ці команди дозволяють перевірити:
• відношення між операндами зі знаком ( "більше - менше");
• відношення між операндами без знака ( "вище - нижче");
• стану арифметичних прапорів zf, sf, cf, of, pf (але не af).
Команди умовного переходу мають однаковий синтаксис: jcc мітка_переходу.
Як бачимо, мемокод всіх команд починається з j - від слова jump (стрибок), cc - визначає конкретну умову, що аналізується командою. Що стосується операнда мітка_переходу, то ця позначка може знаходиться тільки в межах поточного сегмента коду, міжсегментна передача управління в умовних переходах не допускається. У зв'язку з цим відпадає питання про модифікатор, який був присутній в синтаксисі команд безумовного переходу.У ранніх моделях мікропроцесора (i8086, i80186 і i80286) команди умовного переходу могли здійснювати тільки короткі переходи - на відстань від -128 до 127 байт від команди, наступної за командою умовного переходу. Починаючи з моделі мікропроцесора 80386 це обмеження знято, але, як бачите, тільки в межах поточного сегменту коду.
Для того, щоб прийняти рішення про те, куди буде передано керування командою умовного переходу, попередньо має бути сформована умова, на підставі якої і буде прийматися рішення про передачу управління. Джерелами такої умови можуть бути:
• будь-яка команда, що змінює стан арифметичних прапорів;
• команда порівняння cmp, порівнює значення двох операндів;
• стан регістра ecx/cx.
Обговоримо ці варіанти, щоб розібратися з тим, як працюють команди умовного переходу.