Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 44.Ассемблер.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
56 Кб
Скачать
☆

2.11 Команда выхода из подпрограммы

RET — возврат из процедуры (returnfromprocedure). Команда извлекает из стека адрес возврата и возвращает управление из процедуры, вызванной ранее командой CALL Необязательный числовой параметр команды RET указывает количест­во байтов, которые освобождаются в стеке после извлечения адреса возврата. Если процедура имеет атрибут near, то команда RET извлекает из стека одно сло­во и заносит его в регистр IP; если процедура имеет атрибут far, то команда RET извлекает из стека два слова: сначала смещение адреса, а затем адрес сегмента — и заносит их, соответственно, в регистр IP и в регистр CS. Флаги не меняются.

Процедуры могут быть вложенными, глубина вложения допускается любая (ограничивается лишь емкостью стека).

2.12 Команды условной передачи управления

Есть 31 команда условной передачи управления (УПУ), но некоторые попарно совпадают, например: «если >» и «если не < и не =». Разных команд всего 17. Условная передача управления может быть только ближней (near) и короткой (short), то есть метка перехода должна быть в том же сегменте и не далее ±128 байт от УПУ. '

Общий формат команды:

J* метка

где J* — условие передачи управления при выполнении условия.

Команда передает управление по прямому адресу — метке, если условие, указан­ное в команде, соблюдается; в противном случае выполняется следующая по по­рядку команда. Выполнение условия определяется состояниями флагов регист­ра FL, которые установлены по результатам предыдущих формирующих условие перехода операций: арифметических, логических, сравнения и т. д.

Команды условной передачи управления могут быть знаковыми (условие прове­ряется с учетом знака операндов) и беззнаковыми (условие проверяется по абсо­лютным значениям операндов). Каким типом УПУ пользоваться, определяется по содержанию решаемой задачи и, соответственно, типами данных (знаковых или беззнаковых), над которыми выполнялись операции, формирующие условие перехода.

Надо четко различать J* без знака (если сравниваются целые без знака) и со зна­ком (если сравниваются целые со знаком), иначе результат будет совсем не тем (неверным).

Например, пусть регистр АХ содержит 11000110, а регистр ВХ — 00010110 и ко­манда СМР АХ, ВХ сравнивает содержимое этих регистров. Если данные беззна­ковые, то число в АХ больше, а если знаковые — то меньше (поскольку в послед­нем случае единица в крайнем левом разряде определяет знак числа — в АХ число отрицательное).

Команды условной передачи управления для беззнаковых данных

  • JA/JNBE(JumpifAbove/NotBelownorEqual) — переход, если выше/не ниже или равно (переход, если флагиZF- 0 иCF. - 0).

  • JAE/JNB(JumpifAboveorEqual/NotBelow) — переход, если выше или рав­ но/не ниже (CF- 0).

  • JB/JNAE(JumpifBelow/NotAbovenorEqual) — переход, если ниже/не выше или равно (CF- 1).

  • JBE/JNA(JumpifBeloworEqual/NotAbove) — переход, если ниже или рав­ но/не выше (CF- 1 илиAF- 1).

Основные команды ассемблера 373

Команды условной передачи управления для знаковых данных

  • JG/JNLE(JumpifGreater/NotLessnorEgual) — переход, если больше/не мень­ ше или равно (ZF= 0 иSF-OF).

  • JGE/JNL(JumpifGreaterorEqual/NotLess) — переход, если больше или рав­ но/не меньше (SF=OF).

  • JL/JNGE Gump if Less/Not Greater nor Equal) — переход, если меньше/не больше или равно(SF >< OF).

  • JLE/JNG0umPifLessorEqual/NotGreater) — переход, если меньше или рав­ но/не больше (ZF- 1 илиSF><OF).

Команды условной передачи управления для прочих проверок

QJE/JZ(JumpifEqual/Zero) — переход, если равно/нуль (ZF=1).

  • JNE/JNZ(Jvanp ifNotEqual/NotZero) — переход, если не равно/не нуль (ZF= 0).

  • JS(JumpifSign) — переход, если есть знак (отрицательно) (SF- 1).

□ JNS0umPifNotSign) — переход, если нет знака (положительно) (SF= 0). ОJC(JumpifCarry) — переход, если есть перенос (аналогJB) (CF=1).

QJNC(JumpifNotCarry) — переход, если нет переноса (аналогJNB) (CF- 0).

QJO(JumpifOverflow) — переход, если есть переполнение (OF=1).

QJNO(JumPifNotOverflow) — переход, если нет переполнения (OF- 0).

  • JP/JPE (Jump if Parity/Parity Even) — переход, если есть четность (PF = 1).

  • JNP/JPO OumP if No Parity/Parity Odd) — переход, если нет четности (PF = 0).

  • JCXZ(JumPifCXisZero) — переход, если содержимое регистра СХ равно 0 (СХ-0).