Tooprogram.ru

Компьютерный справочник
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Переходы в ассемблере

Переходы (прыжки)

Для корректной обработки данных в ассемблере нужна разветвленность программы. Это достигается использованием условных переходов. Условный переход это такая команда процессору, при которой в зависимости от состояния регистра флагов производится передача управления по некоторому адресу иначе говоря прыжок. Этот адрес может быть ближним или дальним. Прыжок считается ближним, если адрес, на который делается прыжок, находится не дальше чем 128 байт назад и 127 байт вперёд от следующей команды. Дальний прыжок это прыжок дальше, чем на [-128,127] байт. Прыгать просто так в любом месте программы бессмысленно. Каждая команда изменяет регистр флагов в зависимости от результата своей операции. Обычно перед командой прыжка идёт команда сравнения, которая изменяет регистр флагов в зависимости от результата. Команд сравнения две: cmp и test. Наиболее универсальная cmp. О команде test я вам расскажу позже. Команда Cmp производит сравнение двух операндов. Она сравнивает два значения (регистр, память, непосредственное значение) и устанавливает флаг нуля Z (zeroflag) если они равны.

Регистр флагов.

Регистр флагов имеет набор флагов, которые устанавливаются или сбрасываются в зависимости от вычислений или других событий. Я не буду расказывать о всех, а только о некоторых важных:

ZF (Zero flag, Флаг нуля) — Этот флаг устанавливается, когда результат вычисления нулевой (чтобы сравнить — фактически substraction без того, чтобы сохранить(экономить) результаты, но устанавливать флажки только). This flag is set when the result of a calculation is zero (сравнение это фактически вычитание без сохранения результата, и установка соответствующих флагов).

SF (Sign flag, Флаг знака) — Если установлен, значит результат вычисления — отрицательное число.

CF (Carry flag, Флаг переноса — Флаг переноса, содержит крайний левый (старший) бит после вычислений.

OF (Overflow flag, Флаг переполнения — Указывает переполнение результата вычисления, т.е. результат больше, приемник.

Есть еще большое количество флагов (флаг паритета (pf), вспомогательный флаг переноса (af), флаг трассировки (tf), флаг прерывания (if), флаг управления (df), флаг уровня привилегий ввода/вывода (iopl) , флаг вложенности задачи (nt), флаг возобновления (rf), флаг виртуального режима (vm)) но так как мы не будем их использовать, я не буду о них рассказывать.

Прыжки.

Приведу пример самой распространённой команды условного перехода jz:

Если регистр eax равен 42, то управление передастся первой команде после метки metka2.

Также есть команда безусловного перехода — jmp. Она передаёт управление в любом случае. Вы скажете: «Для этого нужна команда call». Я отвечу: «Команда call пихает в стек адрес возврата, а jmp не трогает стек». Условные переходы могут делать только ближний прыжок, а команда jmp может делать и короткий и дальний прыжки. Вот таблица всех условных переходов.

ОпкодЗначение(переход,если. )Условие
JAJump if above (X > Y)CF=0 & ZF=0
JAEJump if above or equal (X >= Y)CF=0
JBJump if below (XCF=1
JBEJump if below or equal (XCF=1 or ZF=1
JCJump if carry (cf=1)CF=1
JCXZJump if CX=0регистр CX=0
JE (то же, что и JZ)Jump if equal (X = Y)ZF=1
JGJump if greater (signed) (X > Y)ZF=0 & SF=OF
JGEJump if greater or equal (signed) (X >= Y)SF=OF
JLJump if less (signed) (XSF != OF
JLEJump if less or equal (signed) (XZF=1 or SF!=OF
JMPБезусловный переход
JNAJump if not above (XCF=1 or ZF=1
JNAEJump if not above or equal (XCF=1
JNBJump if not below (X >= Y)CF=0
JNBEJump if not below or equal (X > Y)CF=1 & ZF=0
JNCJump if not carry (cf=0)CF=0
JNEJump if not equal (X != Y)ZF=0
JNGJump if not greater (signed) (XZF=1 or SF!=OF
JNGEJump if not greater or equal (signed) (XSF!=OF
JNLJump if not less (signed) (X >= Y)SF=OF
JNLEJump if not less or equal (signed) (X > Y)ZF=0 & SF=OF
JNOJump if not overflow (signed) (of=0)OF=0
JNPJump if no parity (pf=0)PF=0
JNSJump if not signed (signed) (sf=0)SF=0
JNZJump if not zero (X != Y)ZF=0
JOJump if overflow (signed) (of=1)OF=1
JPJump if parity (pf=1)PF=1
JPEJump if parity even (PF=1
JPOJump if parity oddPF=0
JSJump if signed (signed)SF=1
JZJump if zero (X = Y)ZF=1
Читать еще:  Model small ассемблер

Все команды перехода имеют один операнд: смещение для перехода.

Организация циклов.

Иногда надо организовать цикл, т.е. совершить повторение количество раз, которое указано в регистре ECX. Следовательно, надо у теле цикла уменьшать значение ECX. Именно для этого предназначена команда loop. Он проверяет, равен ли регистр ECX нулю, если он не равен нулю, то значение регистра ECX уменьшается на 1 и совершается ближний прыжок на смещение указанное в операнде.

Тело цикла выполнится 23h раза.

Команда loope делает то же самое, но перед прыжком проверяет, установлен ли флаг ZF, если он установлен, то прыжок совершается. Точно тоже самое делает команда loopz. Команды loopne и loopnz делают то же сомое что и loope, но прыгают, если флаг ZF сброшен.

С переходами разобрались. Разобрались не только с переходами, но и с циклами. Продолжаем изучение ассемблера, читаем следующий урок.

Команды безусловного перехода. Типы переходов

Ввод и преобразование чисел в языке Ассемблера.

Гуглил, гуглил, так и не нашел то, что нужно, либо просто не знал что это то, что нужно.
Был когда-то конспект, но он утерян (

А еще если кому не трудно, напишите ответ на этот вопрос: Команды безусловного перехода. Типы переходов.
Сверю со своим вариантом.

висит блин долг за прошлый семестр. сессия через 2 недели, надо закрыть задолжность.

22.05.2012, 00:48

Как составить сравнение трех чисел с помощью безусловного перехода jmp
min (x,y,|z|) Среда delphi, через asm. Хоть убейте, не понимаю как составить сравнение 3-х.

Арифметические команды и команды переходов
Напишите программу на языке ассемблера с полным описанием сегментов для вычисления значения y.

команды безусловных и условных переходов.
(Решите плиз) Дан массив из 10 байт.Сформировать другой массив по адресу ES:0050h,в который.

Команды перехода
Уважаемые форумчане, необходим любой код на Assembler, имеющий как можно больше различных команд.

22.05.2012, 09:022

The Jester, вот тебе про переходы:

Безусловный переход — переход независимо от состояния флагов и регистров.
Кроме этого вида есть условный переход: переход по определенному условию.
Таблица условных переходов:
Команда Состояние проверяемых флагов Условие перехода
JA CF = 0 и ZF = 0 если выше
JAE CF = 0 если выше или равно
JB CF = 1 если ниже
JBE CF = 1 или ZF = 1 если ниже или равно
JC CF = 1 если перенос
JE ZF = 1 если равно
JZ ZF = 1 если 0
JG ZF = 0 и SF = OF если больше
JGE SF = OF если больше или равно
JL SF <> OF если меньше
JLE ZF=1 или SF <> OF если меньше или равно
JNA CF = 1 и ZF = 1 если не выше
JNAE CF = 1 если не выше или равно
JNB CF = 0 если не ниже
JNBE CF=0 и ZF=0 если не ниже или равно
JNC CF = 0 если нет переноса
JNE ZF = 0 если не равно
JNG ZF = 1 или SF <> OF если не больше
JNGE SF <> OF если не больше или равно
JNL SF = OF если не меньше
JNLE ZF=0 и SF=OF если не меньше или равно
JNO OF=0 если нет переполнения
JNP PF = 0 если количество единичных битов результата нечетно (нечетный паритет)
JNS SF = 0 если знак плюс (знаковый (старший) бит результата равен 0)
JNZ ZF = 0 если нет нуля
JO OF = 1 если переполнение
JP PF = 1 если количество единичных битов результата четно (четный паритет)
JPE PF = 1 то же, что и JP, то есть четный паритет
JPO PF = 0 то же, что и JNP
JS SF = 1 если знак минус (знаковый (старший) бит результата равен 1)
JZ ZF = 1 если ноль
Логические условия «больше» и «меньше» относятся к сравнениям целочисленных значений со знаком, а «выше и «ниже» — к сравнениям целочисленных значений без знака. Если внимательно посмотреть, то у многих команд можно заметить одинаковые значения флагов для перехода. Это объясняется наличием нескольких ситуаций, которые могут вызвать одинаковое состояние флагов. В этом случае с целью удобства ассемблер допускает несколько различных мнемонических обозначений одной и той же машинной команды условного перехода. Эти команды ассемблера по действию абсолютно равнозначны, так как это одна и та же машинная команда. Изначально в микропроцессоре i8086 команды условного перехода могли осуществлять только короткие переходы в пределах -128. +127 байт, считая от следующей команды. Начиная с микропроцессора i386, эти команды уже могли выполнять любые переходы в пределах текущего сегмента команд. Это стало возможным за счет введения в систему команд микропроцессора дополнительных машинных команд. Для реализации межсегментных переходов необходимо комбинировать команды условного перехода и команду безусловного перехода jmp. При этом можно воспользоваться тем, что практически все команды условного перехода парные, то есть имеют команды, проверяющие обратные условия.
Применение jcxz/jecxz: Команда Состояние флагов в eflags/flags Условие перехода
JCXZ не влияет если регистр CX=0
JECXZ не влияет если регистр ECX=0
Команду jcxz/jecxz удобно использовать со всеми командами, использующими регистр ecx/cx для своей работы. Это команды организации цикла и цепочечные команды. Очень важно отметить то, что команда jcxz/jecxz, в отличие от других команд перехода, может выполнять только близкие переходы в пределах -128. +127 байт, считая от следующей команды. Поэтому для нее особенно актуальна проблема передачи управления далее чем в указанном диапазоне. Для этого можно привлечь команду безусловного перехода jmp. Например, команду jcxz/jecxz можно использовать для предварительной проверки счетчика цикла в регистре cx для обхода цикла, если его счетчик нулевой.

Читать еще:  Язык си машинно ориентированный

Ассемблер. Условия

Обновл. 16 Ноя 2019 |

К условиям в ассемблере относятся инструкции циклов и ветвления. Эти инструкции могут изменять поток выполнения кода в программе.

Типы прыжков

Есть 2 типа выполнения условий в ассемблере:

Прыжок без условия (или ещё «безусловный прыжок») — выполняется инструкцией JMP . Выполнение данной инструкции часто включает передачу управления в адрес инструкции, которая не следует за выполняемой в настоящее время инструкцией. Результатом передачи управления может быть выполнение нового набора инструкций или повторное выполнение текущих инструкций.

Прыжок с условием (или ещё «условный прыжок») — выполняется с помощью инструкций типа J и зависит от самого условия. Условные инструкции, изменяя значение смещения в регистре IP , передают управление, прерывая последовательный поток выполнения кода.

Прежде чем разбираться с этими двумя типами инструкций детальнее, давайте рассмотрим инструкцию CMP .

Инструкция CMP

Инструкция CMP (от англ. «COMPARE») сравнивает два операнда. Фактически, она выполняет операцию вычитания между двумя операндами для проверки того, равны ли эти операнды или нет. Используется вместе с инструкцией условного прыжка.

Синтаксис инструкции CMP :

CMP назначение, источник

Инструкция CMP сравнивает два числовых поля. Операнд назначения может находиться либо в регистре, либо в памяти. Исходным операндом ( источник ) могут быть константы, регистры или память.

Инструкция CMP часто используется для проверки того, достигла ли переменная-счётчик максимального количества раз выполнения цикла или нет.

Прыжок без условия

Как мы уже говорили, безусловный прыжок выполняется инструкцией JMP , которая включает в себя имя метки, куда следует перебросить точку выполнения программы:

В следующем примере мы рассмотрим использование инструкции JMP :

Прыжок с условием

Если в условном прыжке выполняется указанное условие, то точка выполнения программы переносится в указанную инструкцию. Существует множество инструкций условного прыжка в зависимости от условия и данных.

Читать еще:  Безопасность вашей учетной записи

Ниже приведены инструкции условного прыжка, используемые для данных со знаком в арифметических операциях:

Инструкция Описание Тестируемые флаги
JE / JZJ ump E qual (равно) или J ump Z ero (ноль)ZF
JNE / JNZJ ump N ot E qual (не равно) или J ump N ot Z ero (не ноль)ZF
JG / JNLEJ ump G reater (больше) или J ump N ot L ess/ E qual (не меньше/равно)OF, SF, ZF
JGE / JNLJ ump G reater/ E qual (больше/равно) или J ump N ot L ess (не меньше)OF, SF
JL / JNGEJ ump L ess (меньше) или J ump N ot G reater/ E qual (не больше/равно)OF, SF
JLE / JNGJ ump L ess/ E qual (меньше/равно) или J ump N ot G reater (не больше)OF, SF, ZF

В следующей таблице приведены инструкции условного прыжка, используемые для данных без знака в логических операциях:

Инструкция Описание Тестируемые флаги
JE / JZJ ump E qual (равно) или J ump Z ero (ноль)ZF
JNE / JNZJ ump N ot E qual (не равно) или J ump N ot Z ero (не ноль)ZF
JA / JNBE J ump A bove (больше) или J ump N ot B elow/ E qual (не меньше/равно)CF, ZF
JAE / JNBJ ump A bove/ E qual (больше/равно) или J ump N ot B elow (не меньше)CF
JB / JNAEJ ump B elow (меньше) или J ump N ot A bove/ E qual (не больше/равно)CF
JBE / JNA J ump B elow/ E qual (меньше/равно) или J ump N ot A bove (не больше)AF, CF

Следующие инструкции условного прыжка имеют специальное использование и проверяют значение флагов:

Инструкция Описание Тестируемые флаги
JCXZJ ump если CX равно Z eronone
JC J ump если C arry (перенос)CF
JNCJ ump если N o C arry (нет переноса)CF
JOJ ump если O verflow (переполнение)OF
JNO J ump если N o O verflow (нет переполнения)OF
JP / JPE J ump P arity или J ump P arity E ven (если чётность)PF
JNP / JPO J ump N o P arity или J ump P arity O dd (если нечётность)PF
JSJ ump S ign (отрицательное значение)SF
JNS J ump N o S ign (положительное значение)SF

Пример синтаксиса набора инструкций типа J :

Архитектура компьютера

Введение
Теоретическая часть
1Архитектура компьютера
Лабораторный практикум
1Создание программы на языке ассемблера
2Применение функций DOS и BIOS
3Линейные алгоритмы
4Десятичная арифметика
5Команды передачи управления
6Циклы с условием
7Циклы со счетчиком
8Работа с массивами
9Цепочечные команды
Приложения
1Таблица кодов символов ASCII
2Функции DOS и BIOS
Гостевая книга

Лабораторная работа №5

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

Вопросы для повторения:

  1. Какие операторы используются в языках высокого уровня на нелинейных участках программы?
  2. Что такое регистр флагов, флаги и для чего они используются?
  3. Запишите оператор выбора (case) в виде последовательности условных конструкций языка высокого уровня.

Для организации безусловного перехода используется команда jmp (от слова jump — прыжок)

m1:jmp m1 ;безусловный переход на метку m1
mov dl, ‘$’ ;данная команда не будет выполнена
mov dh, 100 ;

Все команды условного перехода имеют одинаковый синтаксис:

Jxx , где xx определяется условием перехода.

В качестве источника условия может использоваться регистр cx, любая арифметическая или логическая команда или специальная команда сравнения cmp :

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

Таблица 1. Перечень команд условного перехода для команды cmp ,

Типы операндовКомандаКритерий переходаЗначения флагов
Любыеjeоперанд_1 = операнд_2zf = 1
Любыеjneоперанд_1<>операнд_2zf = 0
Со знакомjl / jngeоперанд_1 of
Со знакомjle / jngоперанд_1 of or zf = 1
Со знакомjg / jnleоперанд_1 > операнд_2sf = of and zf = 0
Со знакомjge / jnlоперанд_1 => операнд_2sf = of
Без знакаjb / jnaeоперанд_1 операнд_2cf = 0 and zf = 0
Без знакаjae / jnbоперанд_1 => операнд_2cf = 0

Таблица 2. Команды перехода по состоянию флагов

Ссылка на основную публикацию
Adblock
detector