Fe23 - довідник x86 - передачі управління і виклики процедур

У колонці "Операнд" показано, що є операндом для машинної команди. Розмір операнда 16 біт або 32 біта визначається атрибутом розміру операнда.

Варіант (0). Для короткого SHORT переходу зміщення займає всього 1 байт. Тому перехід може бути тільки в межах від (-128) до (+127).

Варіант 1 ). Для близького NEAR переходу зміщення займає 2 байта або 4 байта. Якщо зсув з двох байт, перехід можливий в межах від (-32768) до (+32767).

У перших трьох варіантах перехід відбувається в межах того ж самого сегмента, в якому виконується команда JMP. При такому переході вміст регістра CS не змінюється.

У наступних двох варіантах виконується далекий FAR перехід (межсегментний).

Команда виклику процедури

Решта чотири варіанти повністю однакові для команди JMP і для команди CALL. Повністю збігаються типи переходу, типи операнда, формат машинної команди. (Зрозуміло, що коди операцій для команд JMP і CALL різні).

Всі пояснення після таблиці для команди JMP для варіантів (1). (2). (3). (4) повністю підходять і для команди CALL.

При далеких FAR виклики процедури в стек зберігається ще й значення сегмента CS, причому в стек спочатку заноситься CS, а потім EIP (або IP для режиму "16 біт").

Команда повернення з процедури

Є чотири різних коду операції для команди RET, ці машинні команди виконуються трохи по-різному.

При близькому NEAR повернення з стека витягується значення для EIP, при цьому значення CS залишається незмінним. При далекому FAR повернення з стека витягується значення для EIP, а потім значення для CS.

Тип повернення з процедури - близький NEAR або далекий FAR - повинен відповідати типу виклику процедури командою CALL. Зазвичай асемблер дозволяє додавати до імені команди RET букву "N" або "F" для вказівки типу повернення.

Команди стекового кадру

Стековий кадр - це якийсь програмний механізм, що дозволяє виділити в стеку місце для динамічного розміщення в стеку локальних змінних процедури. Команди ENTER і LEAVE надають апаратну підтримку для цього механізка і полегшують програмування.

Команда ENTER ставиться на початку процедури. Вона готує стековий кадр до роботи. Команда LEAVE ставиться перед виходом з процедури, причому ставиться перед кожною командою RET, якщо виходів кілька. Вона відновлює колишню ситуацію в стеці.

Команда ENTER має два параметри. Перший параметр задає кількість байт, яке потрібно зарезервувати для локальних змінних даної процедури. Другий параметр зазвичай буває дорівнює нулю.

Основні сторінки довідника