%include "io64.inc"
section .text
global CMAIN
CMAIN:
mov rbp, rsp ; 디버깅용 스택 프레임 설정
; 메시지 출력 함수 호출
call PRINT_MSG
; 두 값 중 큰 값 구하기
mov eax, 10
mov ebx, 15
call MAX
; 결과 출력
PRINT_DEC 4, ecx
NEWLINE
xor rax, rax
ret
; 메시지 출력 함수 정의
PRINT_MSG:
PRINT_STRING msg
NEWLINE
ret
; 두 값 중 더 큰 값 반환 함수 정의
MAX:
cmp eax, ebx
jg L1
mov ecx, ebx
jmp L2
L1:
mov ecx, eax
L2:
ret
section .data
msg db 'Hello World', 0x00
자주 사용하는 기능을 독립된 블록으로 분리한 것
코드 재사용성↑, 가독성↑, 유지보수성↑
함수 = 어셈블리 프로시저, 서브루틴call로 함수 호출, ret로 반환[함수 호출자]
call 함수명 ; 호출
[함수 정의부]
함수명:
; 기능 구현
ret ; 복귀
%include "io64.inc"
PRINT_STRING, PRINT_DEC, NEWLINE 등 사용 가능section .text
global CMAIN
section .text : 실행 코드 영역global CMAIN : 링커가 프로그램 진입점으로 인식하도록 설정CMAIN:
mov rbp, rsp ; 디버깅 편의용
PRINT_MSGcall PRINT_MSG
PRINT_MSG 함수 호출 (메시지 출력용)mov eax, 10
mov ebx, 15
MAXcall MAX
MAX 함수 호출 → 두 값 비교 후 더 큰 값 반환PRINT_DEC 4, ecx
NEWLINE
MAX 함수가 반환한 값을 10진수로 출력ecx에 반환값이 담겨 있음xor rax, rax
ret
PRINT_MSG:
PRINT_STRING msg
NEWLINE
ret
msg 문자열 출력MAX 함수MAX:
cmp eax, ebx ; eax와 ebx 비교
jg L1 ; eax > ebx면 L1으로 이동
mov ecx, ebx ; 그렇지 않으면 ecx = ebx
jmp L2 ; 결과 반환 지점으로 이동
L1:
mov ecx, eax ; eax가 더 크면 ecx = eax
L2:
ret ; 호출자 복귀
eax, ebx (비교할 값들)ecx (더 큰 값)| 조건 | 흐름 |
|---|---|
| eax > ebx | L1로 이동 → ecx = eax |
| eax <= ebx | ecx = ebx |
| 공통 | ret로 복귀 |
section .data
msg db 'Hello World', 0x00
| 단계 | 설명 |
|---|---|
| 1 | call로 함수 호출 |
| 2 | 함수 내부 작업 수행 |
| 3 | ret로 원래 위치 복귀 |
| 항목 | 처리 방식 |
|---|---|
| 매개변수 | eax, ebx에 전달 (레지스터 방식) |
| 반환값 | ecx에 저장 |
✅ 매개변수 10개 이상일 때 부족
✅ 다른 함수가 이미 사용하는 레지스터와 충돌 가능
✅ 중첩 함수 호출 시 데이터 관리 어려움
➡️ 스택 방식으로 개선 필요 (이후 학습 주제)