특정 조건에 따라서 코드 흐름을 제어하는 것
CMP dst, src (dst가 기준)
비교를 한 결과물은 Flag Register 저장
JMP [label] 시리즈
JMP : 무조건 jump
JE : JumpEquals 같으면 jump
JNE : JumpNotEquals 다르면 jump
JG : JumpGreater 크면 jump
JGE : JumpGreaterEquals 크거나 같으면 jump
JL
JLE
두 숫자가 같으면 1, 아니면 0을 출력하는 프로그램
mov rax, 10
mov rbx, 20
cmp rax, rbx ; 비교 결과는 Flag Register에 저장
je LABEL_EQUAL
; je에 의해 점프를 안했다면, 같지 않다는 의미
mov rcx, 0
jmp LABEL_EQUAL_END
LABEL_EQUAL:
mov rcx, 1
LABEL_EQUAL_END:
PRINT_HEX 1, rcx
NEWLINE
'eflag register' 로 검색하면 Flag Register 각 비트가 가지는 의미를 알 수 있다. ex) Overflow Flag, Sign Flag, Zero Flag, Carry Flag 등이 있음.
'cmp eflag' 로 검색하면 JE 명령에 대해 '두 값을 뺐을 때 0이면 지정된 주소로 점프 ZF=1' 라고 나와있는데, Flag Register에서 Zero Flag가 켜져있는지 확인하여 동작한다는 뜻이다.
ex) eflags 값이 0x246이면 [ PF ZF IF ] 가 켜져있는 것이다.
연습 문제 : 어떤 숫자(1~100)가 짝수면 1, 홀수면 0을 출력하는 프로그램
mov ax, 100
; 나누기 연산
; div reg
; - div bl => ax / bl (al몫 ah나머지)
mov bl, 2
div bl
cmp ah, 0
je L1
mov rcx, 0
jmp L2
L1:
mov rcx, 1
L2:
PRINT_HEX 1, rcx
NEWLINE