분기문

namu·2022년 6월 29일

특정 조건에 따라서 코드 흐름을 제어하는 것

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
profile
안녕하세요

0개의 댓글