전체 코드

%include "io64.inc"

section .text
global CMAIN
CMAIN:
    mov rbp, rsp ; for correct debugging

    ; [반복문 예제1] Hello World 10번 출력 (loop 없이 직접 구현)
    mov al, 10
    
LABEL_LOOP:
    PRINT_STRING msg
    NEWLINE
    dec al
    cmp al, 0
    jne LABEL_LOOP
    
    NEWLINE

    ; [반복문 예제2] 1부터 100까지 합 구하기 (loop 사용)
    mov ecx, 100
    xor ebx, ebx    ; 합계 초기화

LABEL_LOOP_SUM:
    add ebx, ecx
    loop LABEL_LOOP_SUM

    PRINT_DEC 4, ebx
    NEWLINE

    ; [반복문 예제3] 1부터 100까지 합 구하기 (loop 없이 직접 구현)
    mov eax, 100
    xor ebx, ebx
    xor ecx, ecx

LABEL_SUM:
    inc ecx
    add ebx, ecx
    cmp ecx, eax
    jne LABEL_SUM

    PRINT_DEC 4, ebx
    NEWLINE

    xor rax, rax
    ret

section .data
msg db 'Hello World', 0x00

🔥 반복문이란?

  • 특정 조건을 만족하는 동안 같은 코드를 반복해서 실행하는 구조.
  • 어셈블리에서는 loop 명령어 또는 jmpcmp를 조합해 구현할 수 있다.
  • 반복 횟수를 정하는 카운터가 필요하며, 이 카운터를 조건식에서 확인해 탈출할지를 결정한다.

🔥 반복문을 위한 증감 연산자

명령어의미내부 동작
inc reg1 증가add reg, 1
dec reg1 감소sub reg, 1

📌 반복문 구현 방식 ① - 직접 점프 기반 루프 (기본 방식)

📂 코드 예제: Hello World 10번 출력

mov al, 10    ; 반복 횟수 = 10
  • al에 반복 횟수 저장
LABEL_LOOP:
    PRINT_STRING msg
    NEWLINE
    dec al          ; al -= 1
    cmp al, 0       ; al과 0 비교
    jne LABEL_LOOP  ; 0이 아니면 다시 반복
  • 메시지 출력
  • 반복 횟수 감소
  • 0이면 종료, 아니면 다시 반복

📌 반복문 구현 방식 ② - loop 명령어 기반 (카운터 자동 감소)

📂 코드 예제: 1부터 100까지 합 구하기

mov ecx, 100    ; 반복 횟수 = 100
xor ebx, ebx    ; 합계 저장용 레지스터 초기화
  • ecx에 100 저장 (반복 횟수)
  • ebx는 누적 합계를 저장할 공간 (초기화)
LABEL_LOOP_SUM:
    add ebx, ecx
    loop LABEL_LOOP_SUM
  • ecx 값을 합산
  • loop로 반복 처리 (ecx 1 감소 → 0이면 종료)

📌 반복문 구현 방식 ③ - 직접 증감 및 조건 확인 방식 (일반적 방식)

📂 코드 예제: 1부터 100까지 합 구하기 (loop 없이)

mov eax, 100    ; 목표 수치
xor ebx, ebx    ; 합계 초기화
xor ecx, ecx    ; 현재 수치 초기화
  • 1부터 100까지 더할 준비
  • ebx는 결과 합계 저장
  • ecx는 현재 더하는 값
LABEL_SUM:
    inc ecx        ; ecx += 1
    add ebx, ecx   ; 합계 누적
    cmp ecx, eax   ; 목표 수치 도달 여부 확인
    jne LABEL_SUM  ; 아직 목표 미도달 → 계속 반복
  • 1부터 100까지 더하는 과정 반복
  • 100까지 다 더하면 반복 종료

✅ 출력 처리

PRINT_DEC 4, ebx
NEWLINE
  • 결과 출력 (4바이트 십진수)
  • 줄바꿈 출력

📌 반복문의 핵심 원리 정리

단계설명
1반복 횟수 지정 (카운터 초기화)
2반복할 내용 작성
3반복마다 카운터 감소
4카운터 0인지 확인
50이면 종료, 아니면 반복

🌱 loop 명령어 핵심 정리

  • ecx에 반복 횟수 저장
  • loop 실행 시:
    • ecx 1 감소
    • 0이면 종료
    • 0이 아니면 지정 레이블로 점프

📌 loop 명령어의 단점

  • 점프 범위 제한: 128 byte 이내만 점프 가능
  • 긴 매크로(Print 등) 포함하면, 점프 범위 초과 에러 발생
    (short jump is out of range)

🌟 loop와 jmp의 차이

구분설명
loop반복 횟수 지정하고, 자동 감소 및 점프
jmp+cmp직접 증감하고 조건 확인 후 점프

📣 이런 점 꼭 기억하세요!

  • 반복문은 3요소를 꼭 갖춘다:
    1. 초기값 설정
    2. 조건 검사
    3. 증감 처리
  • loop는 간단한 반복에 적합, 자유도는 낮음
  • jmp+cmp는 모든 상황 대응 가능, 가장 유연함
  • 긴 루프에서는 loop보다 jmp+cmp 방식 권장

📂 loop의 내부 동작 흐름

for (int ecx = 100; ecx > 0; ecx--) {
    sum += ecx;
}

이 코드가 어셈블리에서는 아래처럼 변환

mov ecx, 100
xor ebx, ebx
LABEL_LOOP:
    add ebx, ecx
    loop LABEL_LOOP

profile
李家네_공부방

0개의 댓글