📂 예제 코드와 한 줄 한 줄 설명
%include "io64.inc"
- SASM 환경에서 제공하는 매크로 파일
PRINT_HEX, NEWLINE 등 편의 기능 포함
🔔 코드 섹션 및 진입점 설정
section .text
global main
main:
mov rbp, rsp ; for correct debugging
.text: 실행 코드 영역 지정
global main: 링커가 진입점으로 사용할 수 있도록 선언
mov rbp, rsp: 스택 프레임 설정 (디버깅 시 유용)
📌 분기문 (조건문) 개념 요약
분기문의 의미
- 특정 조건에 따라 코드 흐름을 바꾸는 것
- 대표적인 예:
- 스킬 버튼 눌렀는가? YES → 스킬 사용 / NO → 무시
- 던전 입장 시간 내 수락했는가? YES → 입장 / NO → 취소
CMP 명령어
| 명령어 | 의미 |
|---|
CMP dst, src | dst - src 비교 (결과는 플래그 레지스터에 저장) |
플래그 레지스터란?
- 연산 결과나 상태를 저장하는 특수 레지스터
- CMP 결과도 여기에 기록되어 이후 조건 판단에 사용
조건부 점프 (JMP 시리즈)
| 명령어 | 의미 |
|---|
JMP | 무조건 점프 |
JE | 두 값이 같으면 점프 (Zero Flag = 1) |
JNE | 다르면 점프 |
JG | dst > src이면 점프 |
JGE | dst >= src이면 점프 |
JL | dst < src이면 점프 |
JLE | dst <= src이면 점프 |
📌 예제 1 - 두 숫자 비교하여 같으면 1, 아니면 0 출력
mov rax, 10
mov rbx, 10
rax에 10 저장
rbx에 10 저장 (비교 대상)
cmp rax, rbx
- 두 값 비교 (
rax - rbx)
- 결과는 플래그 레지스터에 저장
je LABEL_EQUAL
mov rcx, 0
jmp LABEL_EQUAL_END
- 다르면
rcx = 0
- 이후
LABEL_EQUAL_END로 강제 점프 (1 설정 회피)
LABEL_EQUAL:
mov rcx, 1
LABEL_EQUAL_END:
PRINT_HEX 1, rcx
NEWLINE
- 결과 출력 (1이면 같음, 0이면 다름)
- 줄바꿈
📌 예제 2 - 1~100 숫자 중 짝수면 1, 홀수면 0 출력
mov ax, 91
mov bl, 2
div bl
- 91을 2로 나눔
al = 몫, ah = 나머지 (여기서 나머지로 홀짝 판별)
cmp ah, 0
je L1
mov rcx, 0
jmp L2
- 0이면 짝수 → L1으로 점프
- 아니면 홀수 →
rcx = 0
- 결과 출력 위치로 점프
L1:
mov rcx, 1
L2:
PRINT_HEX 1, rcx
NEWLINE
xor rax, rax
ret
- 프로그램 종료 (정상 종료 위해 반환값 0 설정)
✅ 정리표 - 플래그 레지스터에 따른 분기 흐름
| 명령어 | 설명 | 조건 |
|---|
je | 두 값이 같을 때 점프 | ZF = 1 |
jne | 두 값이 다를 때 점프 | ZF = 0 |
jg | dst > src일 때 점프 | ZF=0, SF=OF |
jge | dst >= src일 때 점프 | SF=OF |
jl | dst < src일 때 점프 | SF≠OF |
jle | dst <= src일 때 점프 | ZF=1 or SF≠OF |
📌 CMP의 동작 흐름
| 단계 | 설명 |
|---|
cmp a, b | 내부적으로 a - b 수행 |
| 결과 | 플래그 레지스터에 결과 저장 |
| 다음 명령 | je 등 조건부 점프 명령으로 흐름 제어 |
🌱 분기문을 if로 표현하면?
if (rax == rbx) {
rcx = 1;
} else {
rcx = 0;
}
📌 나머지 연산으로 홀짝 판별
| 연산 | 의미 |
|---|
mov ax, n | n 설정 |
mov bl, 2 | 2로 나눔 |
div bl | 몫(al), 나머지(ah) |
cmp ah, 0 | 나머지가 0인지 비교 |
je | 짝수 처리 |
jne | 홀수 처리 |