Jnc команда ассемблер
Ассемблер. Условия
Обновл. 16 Ноя 2019 |
К условиям в ассемблере относятся инструкции циклов и ветвления. Эти инструкции могут изменять поток выполнения кода в программе.
Типы прыжков
Есть 2 типа выполнения условий в ассемблере:
Прыжок без условия (или ещё «безусловный прыжок») — выполняется инструкцией JMP . Выполнение данной инструкции часто включает передачу управления в адрес инструкции, которая не следует за выполняемой в настоящее время инструкцией. Результатом передачи управления может быть выполнение нового набора инструкций или повторное выполнение текущих инструкций.
Прыжок с условием (или ещё «условный прыжок») — выполняется с помощью инструкций типа J и зависит от самого условия. Условные инструкции, изменяя значение смещения в регистре IP , передают управление, прерывая последовательный поток выполнения кода.
Прежде чем разбираться с этими двумя типами инструкций детальнее, давайте рассмотрим инструкцию CMP .
Инструкция CMP
Инструкция CMP (от англ. «COMPARE») сравнивает два операнда. Фактически, она выполняет операцию вычитания между двумя операндами для проверки того, равны ли эти операнды или нет. Используется вместе с инструкцией условного прыжка.
Синтаксис инструкции CMP :
CMP назначение, источник
Инструкция CMP сравнивает два числовых поля. Операнд назначения может находиться либо в регистре, либо в памяти. Исходным операндом ( источник ) могут быть константы, регистры или память.
Инструкция CMP часто используется для проверки того, достигла ли переменная-счётчик максимального количества раз выполнения цикла или нет.
Прыжок без условия
Как мы уже говорили, безусловный прыжок выполняется инструкцией JMP , которая включает в себя имя метки, куда следует перебросить точку выполнения программы:
В следующем примере мы рассмотрим использование инструкции JMP :
Прыжок с условием
Если в условном прыжке выполняется указанное условие, то точка выполнения программы переносится в указанную инструкцию. Существует множество инструкций условного прыжка в зависимости от условия и данных.
Ниже приведены инструкции условного прыжка, используемые для данных со знаком в арифметических операциях:
Инструкция | Описание | Тестируемые флаги |
JE / JZ | J ump E qual (равно) или J ump Z ero (ноль) | ZF |
JNE / JNZ | J ump N ot E qual (не равно) или J ump N ot Z ero (не ноль) | ZF |
JG / JNLE | J ump G reater (больше) или J ump N ot L ess/ E qual (не меньше/равно) | OF, SF, ZF |
JGE / JNL | J ump G reater/ E qual (больше/равно) или J ump N ot L ess (не меньше) | OF, SF |
JL / JNGE | J ump L ess (меньше) или J ump N ot G reater/ E qual (не больше/равно) | OF, SF |
JLE / JNG | J ump L ess/ E qual (меньше/равно) или J ump N ot G reater (не больше) | OF, SF, ZF |
В следующей таблице приведены инструкции условного прыжка, используемые для данных без знака в логических операциях:
Инструкция | Описание | Тестируемые флаги |
JE / JZ | J ump E qual (равно) или J ump Z ero (ноль) | ZF |
JNE / JNZ | J 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 / JNB | J ump A bove/ E qual (больше/равно) или J ump N ot B elow (не меньше) | CF |
JB / JNAE | J 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 |
Следующие инструкции условного прыжка имеют специальное использование и проверяют значение флагов:
Инструкция | Описание | Тестируемые флаги |
JCXZ | J ump если CX равно Z ero | none |
JC | J ump если C arry (перенос) | CF |
JNC | J ump если N o C arry (нет переноса) | CF |
JO | J 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 |
JS | J ump S ign (отрицательное значение) | SF |
JNS | J ump N o S ign (положительное значение) | SF |
Пример синтаксиса набора инструкций типа J :
Архитектура компьютера
| Лабораторная работа №5Команды передачи управленияВопросы для повторения:
Для организации безусловного перехода используется команда jmp (от слова jump — прыжок)
Все команды условного перехода имеют одинаковый синтаксис:
В качестве источника условия может использоваться регистр cx, любая арифметическая или логическая команда или специальная команда сравнения cmp : Команда сравнения cmp , работает почти также как и команда вычитания sub , разница состоит лишь в том, что команда cmp не записывает результат вычитания в первый операнд, результатом выполнения данной команды является установка флагов состояния (команды условного перехода анализируют эти флаги). Таблица 1. Перечень команд условного перехода для команды cmp ,
Таблица 2. Команды перехода по состоянию флагов Команды ассемблераКоманда movКоманда mov производит копирование источника в назначение. Рассмотрим примеры: Внимательно следите, когда вы загружаете адрес переменной, а когда обращаетесь к значению переменной по её адресу. Например: Команда lealea — мнемоническое от англ. 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 , каким оно было до выполнения команды — и она действительно работает именно так. АрифметикаАрифметических команд в нашем распоряжении довольно много. Синтаксис:
Команда mul имеет только один операнд. Второй сомножитель задаётся неявно. Он находится в регистре %eax , и его размер выбирается в зависимости от суффикса команды ( b , w или l ). Место размещения результата также зависит от суффикса команды. Нужно отметить, что результат умножения двух
Давайте подумаем, каким будет результат выполнения следующего кода на Си: Большинство сразу скажет, что результат (250 + 14 = 264) больше, чем может поместиться в одном байте. И что же напечатает программа? 8. Давайте рассмотрим, что происходит при сложении в двоичной системе. Получается, что результат занимает 9 бит, а в переменную может поместиться только 8 бит. Это называется переполнением — перенос из старшего бита результата. В Си переполнение не может быть перехвачено, но в микропроцессоре эта ситуация регистрируется, и её можно обработать. Когда происходит переполнение, устанавливается флаг cf . Команды условного перехода jc и jnc анализируют состояние этого флага. Команды условного перехода будут рассмотрены далее, здесь эта информация приводится для полноты описания команд. Этот код выдаёт правильную сумму в регистре %ax с учётом переполнения, если оно произошло. Попробуйте поменять числа в строках 2 и 3. Adblockdetector |