Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Опорний конспект лекцій_ Асемблер.Docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
506.89 Кб
Скачать
    1. Процедури

Процедура (підпрограма) – це основна одиниця декомпозиції деякої задачі. Синтаксис описання процедури:

Ім’я_процедури PROC [ [модифікатор_мови] мова] [віддаль] ] [ARG список_параметрів]

[RETURNS список_параметрів] [LOCAL список_аргументів] [USES список_регістрів]

тіло процедури (команди, директиви)

[ім’я_процедури] ENDP

Як видно, обов’язковим є тільки задання директив PROC і ENDP. У директиві PROC є операнд [віддаль], який може мати значення near, far і характеризує можливість звернення із другого сегмента. Процедура може знаходитися:

o на початку програми; o в кінці програми;

o в середині другої процедури або основної програми. У цьому випадку необхідно передбачити обхід процедури з допомогою команди jmp;

o у другому модулі.

Ім’я процедури має ті ж атрибути, що і звичайна мітка, тому до неї можна звернутися з допомогою любої команди переходу. Проте є спеціальний механізм виклику процедури, який зберігає контекст (інформація про стан програми у точці виклику процедури). Є дві команди, що здійснюють роботу із контекстом: call і ret:

call [модифікатор] ім’я_процедури – виклик процедури. Команда call передає керування по адресу з символічним іменем ім’я_процедури і при в стекові зберігається адрес повернення. Адрес повернення – це адрес команди, наступної після call.

ret [число] – повернути керування викликаючій програмі. Команда ret зчитує адрес повернення із стека і завантажує його в регістри cs і ip/eip. [число] – необов’язковий параметр, який вказує скільки елементів видалити із стека при поверненні.

Виклик процедури може бути:

o внутрішньосегментним – процедура знаходиться у поточному сегменті коду (має тип near) і в якості адреса повернення зберігається вміст регістра ip/eip;

o міжсегментним – процедура знаходиться у другому сегменті коду (має тип far) і в якості адреса повернення зберігається вміст регістрів cs і ip/eip.

    1. Умовні переходи

Є 18 команд умовного переходу, які дозволяють перевірити: o відношення між операндами із знаком (більше-менше); o відношення між операндами без знака (вище-нище); o стан арифметичних прапорів (zf, sf, cf, of, pf).

Синтаксис команд умовного переходу:

jcc мітка_перехода

Значення абревіатури в назві команді jcc наведено в табл. 1. Мітка переходу може знаходитися тільки в межах поточного сегменту. Для того, щоб прийняти рішення, куди буде передано керування, необхідно сформувати умову. Джерелом такої умови можуть бути:

o люба команда, що міняє стан арифметичних прапорів; o команда порівняння cmp, що порівнює значення двох операндів; o стан регістру ecx/cx.

      1. Команда порівняння cmp

Команда cmp віднімає операнди і порівнює прапори:

cmp операнд_1, операнд_2

Прапори, які встановлює команда команда cmp, можна аналізувати спеціальними командами умовного переходу із табл. 6.1. Так як команди умовного переходу не змінюють прапорів, то то після однієї команди cmp може слідувати декілька команд умовного перехода.

Табл. 6.1

Перелік команд умовного переходу для команди cmp

Типи операндів

Мнемокод

Критерій умовного переходу

Значення прапорів для перехода

Любі

je

операнд_1 = операнд_2

zf=1

Любі

jne

операнд_1 <> операнд_2

zf=0

Із знаком

jl/jnge

операнд_1 < операнд_2

sf<>of

Із знаком

jle/jng

операнд_1 <= операнд_2

sf<>of або zf=1

Із знаком

jg/jnle

операнд_1 > операнд_2

sf=of і zf=0

Із знаком

jge/jnl

операнд_1 => операнд_2

sf=of

Без знаку

jb/jnae

операнд_1 < операнд_2

cf=1

Без знаку

jbe/jna

операнд_1 <= операнд_2

cf=1 або zf=1

Без знаку

ja/jnbe

операнд_1 > операнд_2

cf=0 і zf=0

Без знаку

jae/jnb

операнд_1 => операнд_2

cf=0

* Примітка. g-більше, l-менше, а-вище, b-нище