0-8. 분기문(If)

Crat3 ㅣ 2023. 4. 28. 14:15

만약 A가 B라면, C를 실행하고 아니면 D를 실행한다.

1. 조건 체크

CMP(Compare) dst(Destination), src(Source)

비교를 한 결과물은 Flag Register에 저장됨.

 

(1) JMP [label] 시리즈

JMP ; 무조건 Label 위치로 이동

JE ; Jump Equals, 같으면 Label 위치로 이동

JNE ; Jump Not Equals, 다르면 Label 위치로 이동

JG ; Jimp Greater, 크면 Label 위치로 이동

JGE ; Jump Greater Equals, 크거나 같으면 Label 위치로 이동

mov rax, 10
mov rbx, 20

cmp rax, rbx

je LABEL_EQUAL ; rax와 rbx가 같으면 LABEL_EQUAL로 이동

mov rcx, 0 ; rax와 rbx가 같지 않으면 rcx에 0을 저장함
jmp LABEL_EQUAL_END ; LABEL_EQUAL_END로 이동

LABEL_EQUAL:
mov rcx,1  ; rax와 rbx가 같으면 rcx에 1을 저장하고 출력함
PRINT_HEX 1, rcx  ;  rcx를 출력함

LABEL_EQUAL_END:
PRINT_HEX 1, rcx  ;  rcx를 출력함

(2) eflags(Flag Register)

ZF ; 두 수의 차이가 0일 때

 

연습문제 : 어떤 숫자(0~100)가 짝수면 1, 홀수면 0을 출력함

div bl => ax(몫)  bl(나머지)

main:
mov rbp, rsp ; for correct debugging
mov rax, 0 ; 레지스터 초기화
GET_DEC 1, rax ; input을 rax에 저장
mov bl, 0b10 ; 나누는 수를 2로 지정
div bl
cmp ah, 0 ; 나머지가 0인지 감별

je LABEL_EVEN


mov rcx,0
PRINT_HEX 1, rcx
NEWLINE

jmp LABEL_END


LABEL_EVEN:
mov rcx, 1
PRINT_HEX 1, rcx
NEWLINE


LABEL_END:
xor rax, rax
ret

'어셈블리' 카테고리의 다른 글

0-10. 배열과 주소(Array, Address)  (0) 2023.04.28
0-9. 반복문(Loop)  (0) 2023.04.28
0-7. 시프트 연산과 논리 연산  (0) 2023.04.28
0-6. 사칙연산  (0) 2023.04.27
0-5. 문자와 엔디안  (0) 2023.04.27