조립-조건

어셈블리 언어의 조건부 실행은 여러 루핑 및 분기 명령으로 수행됩니다. 이러한 명령어는 프로그램의 제어 흐름을 변경할 수 있습니다. 조건부 실행은 두 가지 시나리오에서 관찰됩니다.

Sr. 아니. 조건부 지침
1

Unconditional jump

이것은 JMP 명령에 의해 수행됩니다. 조건부 실행에는 종종 현재 실행중인 명령어를 따르지 않는 명령어의 주소로의 제어 전송이 포함됩니다. 제어 이전은 새로운 명령 세트를 실행하기 위해 앞으로 또는 동일한 단계를 다시 실행하기 위해 뒤로 수행 될 수 있습니다.

2

Conditional jump

이것은 조건에 따라 점프 명령 j <condition> 세트에 의해 수행됩니다. 조건부 명령어는 순차 흐름을 중단하여 제어를 전송하고 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 같지 않은 점프 또는 0이 아닌 점프 ZF
JG / JNLE 더 크게 또는 덜 / 같지 않게 점프 OF, SF, ZF
JGE / JNL 더 크게 / 동등하게 또는 더 적게 점프 OF, SF
JL / JNGE 덜 점프하거나 크거나 같지 않게 점프 OF, SF
JLE / JNG 덜 / 동등하게 또는 더 크지 않게 점프 OF, SF, ZF

다음은 논리 연산에 사용되는 부호없는 데이터에 사용되는 조건부 점프 명령어입니다.

교수 기술 테스트 된 플래그
JE / JZ 동등 점프 또는 제로 점프 ZF
JNE / JNZ 같지 않은 점프 또는 0이 아닌 점프 ZF
JA / JNBE 위로 점프 또는 아래로 점프 / 같지 않음 CF, ZF
JAE / JNB 위 / 같음 또는 아래로 점프 CF
JB / JNAE 아래로 점프 또는 위 / 같지 않음으로 점프 CF
JBE / JNA 아래로 / 동등하거나 위로 점프하지 않음 AF, CF

다음 조건부 점프 명령은 특별한 용도로 사용되며 플래그 값을 확인합니다.

교수 기술 테스트 된 플래그
JXCZ CX가 0이면 점프 없음
JC 운반하면 점프 CF
JNC 캐리가 없으면 점프 CF
JO 넘치면 점프
JNO 오버플로가 없으면 점프
JP / JPE 점프 패리티 또는 점프 패리티 짝수 PF
JNP / JPO 패리티 없음 또는 패리티 홀수 점프 PF
JS 점프 부호 (음수) SF
JNS 부호 없음 (양수 값) SF

J <condition> 명령어 세트에 대한 구문-

예,

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