Tooprogram.ru

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

Jnc команда ассемблер

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

Обновл. 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. Команды перехода по состоянию флагов

Команды ассемблера

Команда mov

Команда mov производит копирование источника в назначение. Рассмотрим примеры:

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

Команда lea

lea — мнемоническое от англ. Load Effective Address. Синтаксис:

Команда lea помещает адрес источника в назначение. Источник должен находиться в памяти (не может быть непосредственным значением — константой или регистром). Например:

Команды для работы со стеком

Предусмотрено две специальные команды для работы со стеком: push (поместить в стек) и pop (извлечь из стека). Синтаксис:

При описании работы стека мы уже обсуждали принцип работы команд push и pop . Важный нюанс: push и pop работают только с операндами размером 4 или 2 байта. Если вы попробуете скомпилировать что-то вроде

GCC вернёт следующее:

Согласно ABI, в Linux стек выровнен по long . Сама архитектура этого не требует, это только соглашение между программами, но не рассчитывайте, что другие библиотеки подпрограмм или операционная система захотят работать с невыровненным стеком. Что всё это значит? Если вы резервируете место в стеке, количество байт должно быть кратно размеру long , то есть 4. Например, вам нужно всего 2 байта в стеке для short , но вам всё равно придётся резервировать 4 байта, чтобы соблюдать выравнивание. А теперь примеры:

Интересный вопрос: какое значение помещает в стек вот эта команда

Если ещё раз взглянуть на алгоритм работы команды push , кажется очевидным, что в данном случае она должна поместить уже уменьшенное значение %esp . Однако в документации Intel 1 Intel® 64 and IA-32 Architectures Software Developer’s Manual, 4.1 Instructions (N-Z), PUSH сказано, что в стек помещается такое значение %esp , каким оно было до выполнения команды — и она действительно работает именно так.

Арифметика

Арифметических команд в нашем распоряжении довольно много. Синтаксис:

  • inc : увеличивает операнд на 1.
  • dec : уменьшает операнд на 1.
  • add : приёмник = приёмник + источник (то есть, увеличивает приёмник на источник).
  • sub : приёмник = приёмник — источник (то есть, уменьшает приёмник на источник).

Команда mul имеет только один операнд. Второй сомножитель задаётся неявно. Он находится в регистре %eax , и его размер выбирается в зависимости от суффикса команды ( b , w или l ). Место размещения результата также зависит от суффикса команды. Нужно отметить, что результат умножения двух -разрядных чисел может уместиться только в -разрядном регистре результата. В следующей таблице описано, в какие регистры попадает результат при той или иной разрядности операндов.

КомандаВторой сомножительРезультат
mulb%al16 бит: %ax
mulw%ax32 бита: младшая часть в %ax , старшая в %dx
mull%eax64 бита: младшая часть в %eax , старшая в %edx

Давайте подумаем, каким будет результат выполнения следующего кода на Си:

Большинство сразу скажет, что результат (250 + 14 = 264) больше, чем может поместиться в одном байте. И что же напечатает программа? 8. Давайте рассмотрим, что происходит при сложении в двоичной системе.

Получается, что результат занимает 9 бит, а в переменную может поместиться только 8 бит. Это называется переполнением — перенос из старшего бита результата. В Си переполнение не может быть перехвачено, но в микропроцессоре эта ситуация регистрируется, и её можно обработать. Когда происходит переполнение, устанавливается флаг cf . Команды условного перехода jc и jnc анализируют состояние этого флага. Команды условного перехода будут рассмотрены далее, здесь эта информация приводится для полноты описания команд.

Этот код выдаёт правильную сумму в регистре %ax с учётом переполнения, если оно произошло. Попробуйте поменять числа в строках 2 и 3.

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