Сборка - Условия
Условное выполнение на языке ассемблера выполняется несколькими инструкциями цикла и ветвления. Эти инструкции могут изменить поток управления в программе. Условное исполнение наблюдается в двух сценариях -
Sr. No. | Условные инструкции |
---|---|
1 | Unconditional jump Это выполняется инструкцией JMP. Условное выполнение часто включает передачу управления по адресу инструкции, которая не следует за инструкцией, выполняемой в данный момент. Передача управления может быть вперед, чтобы выполнить новый набор инструкций, или назад, чтобы повторно выполнить те же шаги. |
2 | Conditional jump Это выполняется набором инструкций перехода j <условие> в зависимости от условия. Условные инструкции передают управление, прерывая последовательный поток, и делают это, изменяя значение смещения в 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 / JNA | Прыгайте ниже / наравне или прыгайте не выше | AF, CF |
Следующие инструкции условного перехода имеют специальное использование и проверяют значение флагов:
Инструкция | Описание | Флаги протестированы |
---|---|---|
JXCZ | Перейти, если CX равен нулю | никто |
JC | Перейти, если нести | CF |
JNC | Перейти, если не переносить | CF |
ДЖО | Перейти при переполнении | Из |
JNO | Перейти, если нет переполнения | Из |
JP / JPE | Перейти к четности или перейти к четности | PF |
JNP / JPO | Переход без четности или переход без четности Нечетный | 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
Когда приведенный выше код компилируется и выполняется, он дает следующий результат:
The largest digit is:
47