Сборка - Условия

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

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