전체 코드
%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 명령어 또는 jmp와 cmp를 조합해 구현할 수 있다.
- 반복 횟수를 정하는 카운터가 필요하며, 이 카운터를 조건식에서 확인해 탈출할지를 결정한다.
🔥 반복문을 위한 증감 연산자
| 명령어 | 의미 | 내부 동작 |
|---|
inc reg | 1 증가 | add reg, 1 |
dec reg | 1 감소 | sub reg, 1 |
📌 반복문 구현 방식 ① - 직접 점프 기반 루프 (기본 방식)
📂 코드 예제: Hello World 10번 출력
mov al, 10 ; 반복 횟수 = 10
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
📌 반복문의 핵심 원리 정리
| 단계 | 설명 |
|---|
| 1 | 반복 횟수 지정 (카운터 초기화) |
| 2 | 반복할 내용 작성 |
| 3 | 반복마다 카운터 감소 |
| 4 | 카운터 0인지 확인 |
| 5 | 0이면 종료, 아니면 반복 |
🌱 loop 명령어 핵심 정리
ecx에 반복 횟수 저장
- loop 실행 시:
ecx 1 감소
- 0이면 종료
- 0이 아니면 지정 레이블로 점프
📌 loop 명령어의 단점
- 점프 범위 제한: 128 byte 이내만 점프 가능
- 긴 매크로(Print 등) 포함하면, 점프 범위 초과 에러 발생
(short jump is out of range)
🌟 loop와 jmp의 차이
| 구분 | 설명 |
|---|
| loop | 반복 횟수 지정하고, 자동 감소 및 점프 |
| jmp+cmp | 직접 증감하고 조건 확인 후 점프 |
📣 이런 점 꼭 기억하세요!
- 반복문은 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