- •Лекция №33 Адресация регистров и ячеек памяти в ассемблере. Основные команды языка ассемблер.
- •Адресация регистров и ячеек памяти в ассемблере
- •1.1 Непосредственная адресация
- •1.2 Прямая адресация регистров мпп
- •1.3 Адресация ячеек оп
- •Основные команды ассемблера
- •2.1 Команды пересылки данных
- •2.2 Арифметические команды
- •2.4 Команды приращения
- •2.5 Команды умножения
- •2.3 Команды сложения, вычитания и сравнения
- •2.6 Команды деления
- •2.7 Логические команды
- •2.8 Команды безусловной передачи управления
- •2.9 Команды перехода к подпрограмме и выхода из подпрограммы
- •2.10 Команда перехода к подпрограмме: calLopr
- •2.11 Команда выхода из подпрограммы
- •2.12 Команды условной передачи управления
- •2.13 Команды управления циклами
- •2.14 Команды прерывания
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).
