Учебники

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

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

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 соответственно —

Live Demo

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  

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —