Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
асм.docx
Скачиваний:
16
Добавлен:
27.10.2018
Размер:
644.06 Кб
Скачать

23. Команди передачі керування (безумовні переходи)

Обійтися лінійними ділянками програми неспроможні, адже в алгоритмі наявні цикли, розгалуження, а також певні частини програми оформлені як підпрограми, організація виклику яких зумовлює переходи в програмі. Для цього потрібно виконувати команди, які визначаються конкретними адресами переходів. Такі команди називаються командами керування програмою. Є дві різновидності команд: внутрісегментні (near) – тут вимагається модифікація вмісту тільки регістра ip/eip, та між сегментні (far) – тут вимагається модифікація вмісту двох регістрів: регістра cs та регістра ip/eip. У першому випадку довжина вказівника 16 або 32 біти, у другому випадку – це вказівник-структура, довжиною 32 або 48 бітів. Команди передачі керування far jmp і far call можуть звертатися до будь-якої точки адресного простору в межах поточного рівня привілеїв, а передача керування між рівнями реалізується командою far call через проміжний шлюз виклику. Більше того, команди far jmp і far call в мікропроцесорі i486+ можуть здійснювати складні дії, пов’язані з перемиканням задач з однієї на іншу.

Адреса переходу в програмах мовою асемблера задається міткою переходу тієї команди, на яку передається керування. Транслятор з мови у відповідності з типом near або far формує потрібну команду.

В системі команд є п’ять форм команд безумовних переходів jmp, які розрізняються відстанню від від поточної команди і способом задання цільової адреси. Три з цих команд внутрісегментні і дві між сегментні.

Команда jmp rel8 забезпечує короткий (short) перехід (rel від слова relative, означає відносний). У другому байті знаходиться зміщення, яке інтерпретується як знакове ціле. Значення зміщення додається (з розширенням знаку до 16/32 бітів) до вмісту регістра ip/eip, яке відповідає адресі команди, що знаходиться після команди jmp. Діапазон зміни rel8 від –128 до +127. Відносна адресація забезпечує позиційну незалежність ділянки програми в оперативній пам’яті.

Команда прямого в межах сегмента (near) переходу jmp rel16/32. Аналогічна попередній, але має повне зміщення 16 бітів або 32 біти (залежить від параметра сегмента коду use16 або use32). Зміщення знакове ціле, яке додається до ip/eip.

Команда непрямого переходу в межах одного сегмента jmp reg/mem. Адреса переходу знаходиться в регістрі або в оперативній пам’яті. Завантажується під час виконання в регістр ip/eip. Розмір зміщення відповідно 16 бітів або 32 біти.

Команда прямого між сегментного переходу jmp ptr. Адреса переходу задається як безпосередній операнд, який складається з 16-бітового селектора та 16- або 32-бітового зміщення. Селектор завантажується в регістр cs, а зміщення в регістр ip або в регістр eip відповідно. Розмір зміщення залежить від розміру цільового сегмента коду.

Команда непрямого між сегментного переходу jmp mem. Адреса переходу знаходиться в оперативній пам’яті і є повним 32- або 48-бітовим вказівником селектор:зміщення. Селектор завантажується в регістр cs, а зміщення – в регістр ip або eip в залежності від розміру цільового сегмента коду.

У певних випадках селектор може бути селектором шлюзу виклику або шлюзу задачі, а також селектором сегмента стану задачі TSS. У цих випадках зміщення в jmp ігнорується, а нове значення ip або eip вибирається зі шлюзу або сегмента TSS нової задачі. При переході на нову задачу змінюються всі прапорці, оскільки регістр eflags завантажується з TSS.

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