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