[ASM] 분기문

👻 분기문

특정 조건에 따라 코드 흐름을 제어하는 명령어를 의미한다.

  • 스킬 버튼을 눌렀는가?
    • YES 👉 스킬 사용
  • 제한 시간 내에 던전 입장 수락 버튼을 눌렀는가?
    • YES 👉 입장
    • NO 👉 던전 취소

🌱 CMP

어셈블리에선 CMP(Compare)라는 명령어로 분기를 나눈다.

CMP dst, src
  • Compare destination, source
  • dst가 기준이다.
  • 비교를 한 결과물은 Flag Register에 저장된다.

💡 Flag Register 결과물에 따라 특수 목적으로 저장해주는 레지스터를 의미한다.
cf) 연산 결과, 비교 결과, 상태 저장 등에 쓰인다.


🪐 분기 명령어 (Jump 시리즈)

CMP로 조건을 걸고, 그 결과에 따라 분기를 나뉘어주는 Jump 시리즈가 존재한다. 말 그대로 Jump(이동)한다는 의미이고 이동하는 곳은 다른 코드의 위치이다.

  • JMP : 무조건 점프
  • JE : JumpEquals. 같으면 점프
  • JNE : JumpNotEquals. 다르면 점프
  • JG : JumpGreater. dst가 src보다 크면 점프
  • JGE : JumpGreaterEquals. dst가 src보다 크거나 같으면 점프
  • JL : JumpLess. dst가 src보다 작으면 점프
  • JLE : JumpLessEquals. dst가 src보다 작거나 같으면 점프
; ex) 두 숫자가 같으면 1, 아니면 0을 출력하는 프로그램
    mov rax, 10
    mov rbx, 20
    
    cmp rax, rbx
    
    je LABEL_EQUAL
    
    mov rcx, 0
    
    jmp LABEL_EQUAL_END
    
LABEL_EQUAL:
    mov rcx, 1
    
LABEL_EQUAL_END:
    PRINT_HEX 1, rcx
    NEWLINE

두 개의 값이 같지 않으므로 LABEL_EQUAL로 점프하지 않고 mov rcx, 0이 실행된 후 LABEL_EQUAL_END로 무조건 점프를 하게된다. 결과값은 0이 나온다.

💡 LABEL
코드를 묶어주는 기능을 한다. 어셈블리에서만 사용되며 결과물이 나올 때는 없어진다.


🌱 연습 문제

어떤 숫자(1~100)가 짝수면 1, 홀수면 0을 출력하라.

    mov ax, 100 ; 짝수
    mov bl, 2
    
    div bl
    
    cmp ah, 0
    
    je LABEL_EQUAL2
    
    mov rcx, 0
    jmp LABEL_EQUAL_END2
    
LABEL_EQUAL2:
    mov rcx, 1
    
LABEL_EQUAL_END2:
    PRINT_HEX 1, rcx
    NEWLINE

결과값은 1이 출력된다. ax의 값을 홀수로 변경하면 결과값은 0이 출력된다.


👻 글을 마치며

이번 시간에는 어셈블리어로 분기문에 대해 공부해보았다. 다른 코드들은 if나 switch를 사용할텐데 어셈블리어는 비교할 두 수를 먼저 지정한 다음 각 조건에 따라 코드를 점프하는 방식으로 진행된다. 처음 접했을 땐 어색해서 어려웠지만 하다보니 코드의 흐름을 자연스레 이해할 수 있게 되었다.


소스코드 보러가기


출처
인프런 Rookies님 강의

Leave a comment