Условное выполнение на ассемблере выполняется несколькими инструкциями зацикливания и ветвления. Эти инструкции могут изменить поток управления в программе. Условное исполнение наблюдается в двух сценариях —
Sr.No. | Условные Инструкции |
---|---|
1 |
Безусловный прыжок Это выполняется инструкцией JMP. Условное выполнение часто включает передачу управления на адрес инструкции, которая не следует за выполняемой в настоящее время инструкцией. Передача управления может быть прямой, чтобы выполнить новый набор инструкций, или обратной, чтобы повторно выполнить те же самые шаги. |
2 |
Условный переход Это выполняется с помощью набора инструкций перехода <условие> в зависимости от условия. Условные инструкции передают управление, прерывая последовательный поток, и делают это, изменяя значение смещения в IP. |
Безусловный прыжок
Это выполняется инструкцией JMP. Условное выполнение часто включает передачу управления на адрес инструкции, которая не следует за выполняемой в настоящее время инструкцией. Передача управления может быть прямой, чтобы выполнить новый набор инструкций, или обратной, чтобы повторно выполнить те же самые шаги.
Условный переход
Это выполняется с помощью набора инструкций перехода <условие> в зависимости от условия. Условные инструкции передают управление, прерывая последовательный поток, и делают это, изменяя значение смещения в IP.
Давайте обсудим инструкцию CMP, прежде чем обсуждать условные инструкции.
Инструкция CMP
Инструкция CMP сравнивает два операнда. Обычно используется в условном исполнении. Эта инструкция в основном вычитает один операнд из другого для сравнения, равны ли операнды или нет. Он не мешает операндам назначения или источника. Он используется вместе с инструкцией условного перехода для принятия решения.
Синтаксис
CMP destination, source
CMP сравнивает два числовых поля данных. Операнд-адресат может быть либо в регистре, либо в памяти. Исходным операндом могут быть постоянные (непосредственные) данные, регистр или память.
пример
CMP DX, 00 ; Compare the DX value with zero JE L7 ; If yes, then jump to label L7 . . L7: ...
CMP часто используется для сравнения того, достигло ли значение счетчика количества раз, которое цикл должен быть выполнен. Рассмотрим следующее типичное условие —
INC EDX CMP EDX, 10 ; Compares whether the counter has reached 10 JLE LP1 ; If it is less than or equal to 10, then jump to LP1
Безусловный прыжок
Как упоминалось ранее, это выполняется инструкцией JMP. Условное выполнение часто включает передачу управления на адрес инструкции, которая не следует за выполняемой в настоящее время инструкцией. Передача управления может быть прямой, чтобы выполнить новый набор инструкций, или обратной, чтобы повторно выполнить те же самые шаги.
Синтаксис
Инструкция JMP предоставляет имя метки, куда поток управления передается немедленно. Синтаксис инструкции JMP:
JMP label
пример
Следующий фрагмент кода иллюстрирует инструкцию JMP —
MOV AX, 00 ; Initializing AX to 0 MOV BX, 00 ; Initializing BX to 0 MOV CX, 01 ; Initializing CX to 1 L20: ADD AX, 01 ; Increment AX ADD BX, AX ; Add AX to BX SHL CX, 1 ; shift left CX, this in turn doubles the CX value JMP L20 ; repeats the statements
Условный переход
Если в условном переходе выполняется какое-либо заданное условие, поток управления переносится в целевую инструкцию. Существует множество инструкций условного перехода в зависимости от состояния и данных.
Ниже приведены инструкции условного перехода, используемые для подписанных данных, используемых для арифметических операций.
инструкция | Описание | Флаги проверены |
---|---|---|
JE / JZ | Прыжок равный или прыжок ноль | ZF |
JNE / JNZ | Прыжок не равен или Прыжок не ноль | ZF |
JG / JNLE | Прыгай больше или прыгай не меньше / равно | OF, SF, ZF |
JGE / JNL | Прыгай больше / равно или прыгай не меньше | OF, SF |
JL / JNGE | Прыгай меньше или прыгай не больше / равно | OF, SF |
JLE / JNG | Прыгай меньше / равно или прыгай не больше | OF, SF, ZF |
Ниже приведены инструкции условного перехода, используемые для неподписанных данных, используемых для логических операций.
инструкция | Описание | Флаги проверены |
---|---|---|
JE / JZ | Прыжок равный или прыжок ноль | ZF |
JNE / JNZ | Прыжок не равен или Прыжок не ноль | ZF |
JA / JNBE | Прыгать выше или прыгать не ниже / равно | CF, ZF |
JAE / JNB | Прыгай выше / равно или прыгай не ниже | CF |
JB / JNAE | Прыжок ниже или Прыжок не выше / равно | CF |
JBE / ЮНА | Прыжок ниже / равно или Прыжок не выше | AF, CF |
Следующие инструкции условного перехода имеют специальное использование и проверяют значение флагов:
инструкция | Описание | Флаги проверены |
---|---|---|
JXCZ | Прыгать, если CX равен нулю | никто |
JC | Прыгай, если несешь | CF |
JNC | Прыгай, если не неси | CF |
ДЖО | Прыжок, если переполнен | О |
JNO | Прыжок, если нет переполнения | О |
В JP / JPE | Прыжок Паритет или Прыжок Паритет Даже | PF |
JNP / МСС | Прыжок без четности или нечетный четность | PF |
JS | Знак прыжка (отрицательное значение) | SF |
JNS | Прыжок без знака (положительное значение) | SF |
Синтаксис для набора инструкций J <условие> —
Пример,
CMP AL, BL JE EQUAL CMP AL, BH JE EQUAL CMP AL, CL JE EQUAL NON_EQUAL: ... EQUAL: ...
пример
Следующая программа отображает наибольшую из трех переменных. Переменные являются двузначными переменными. Три переменные num1, num2 и num3 имеют значения 47, 22 и 31 соответственно —
section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov ecx, [num1] cmp ecx, [num2] jg check_third_num mov ecx, [num2] check_third_num: cmp ecx, [num3] jg _exit mov ecx, [num3] _exit: mov [largest], ecx mov ecx,msg mov edx, len mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov ecx,largest mov edx, 2 mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax, 1 int 80h section .data msg db "The largest digit is: ", 0xA,0xD len equ $- msg num1 dd '47' num2 dd '22' num3 dd '31' segment .bss largest resb 2
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —