🙇‍♀️분기문과 반복문

🪐분기문

  • 분기문 (if)
    • 특정 조건에 따라서 코드 흐름을 제어하는 것
    • ex) 스킬 버튼을 눌렀는가? YES -> 스킬사용
    • ex) 제한 시간 내에 던전 입장 수락 버튼을 눌렀는가? YES -> 입장, NO -> 던전 취소

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
je LABEL_EQUAL

; je에 의해 점프를 안했다면, 같지 않다는 의미
mov rcx, 0
jmp LABEL_EQUAL_END

LABEL_EQUAL:
 mov rcx, 1
LABEL_EQUAL_END:
 PRINT_HEX 1, rcx
 NEWLINE

eflags_registers

  • 연습 문제 : 어떤 숫자(1~100)가 짝수면 1, 홀수면 0을 출력하는 프로그램

mov ax, 100

cf) 나누기 연산

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

🪐반복문

  • 반복문 (while for)
    • 특정 조건을 만족 할 때까지 반복해서 실행
  • ex) Hello World를 10번 출력해야 한다면?
    mov ecx, 10
    LABEL_LOOP:
    PRINT_STRING msg
    NEWLINE
    dec ecx ; sub ecx, 1과 동일
    cmp ecx, 0
    jne LABEL_LOOP
    
  • 연습 문제) 1에서 100까지의 합을 구하는 프로그램 1+2+3+4…100 = ?
mov eax, 100 ; 최종 목적지
xor ebx, ebx ; mov ebx, 0 ebx: 결과물
xor ecx, ecx

LABEL_SUM:
inc ecx ; add ecx, 1과 동일
add ebx, ecx ; 
cmp ecx, eax
jne LABEL_SUM

PRINT_DEC 4, ebx
NEWLINE
  • loop [라벨]
    • ecx에 반복 횟수
    • loop 할때마다 ecx 1 감소. 0이면 빠져나감. 아니면 라벨로 이동
mov ecx, 100
xor ebx, ebx ; mov ebx, 0 ebx: 결과물
LABEL_LOOP_SUM:
add ebx, ecx
loop LABEL_LOOP_SUM

태그:

카테고리:

업데이트: