전체 코드

%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

📌 함수(Function)란?

자주 사용하는 기능을 독립된 블록으로 분리한 것
코드 재사용성↑, 가독성↑, 유지보수성↑

  • C언어 함수 = 어셈블리 프로시저, 서브루틴
  • 어셈블리에서는 call로 함수 호출, ret로 반환
  • 여러 함수끼리 스택(Stack)을 통해 매개변수와 반환값을 주고받음

📌 함수 구성 기본 틀

[함수 호출자]
call 함수명 ; 호출
[함수 정의부]
함수명:
    ; 기능 구현
    ret ; 복귀

📂 예제 코드 전체 분석


📂 헤더 및 초기 설정

%include "io64.inc"
  • 입출력용 매크로가 담긴 파일 포함
  • PRINT_STRING, PRINT_DEC, NEWLINE 등 사용 가능
section .text
global CMAIN
  • section .text : 실행 코드 영역
  • global CMAIN : 링커가 프로그램 진입점으로 인식하도록 설정
CMAIN:
    mov rbp, rsp ; 디버깅 편의용
  • RBP를 현재 스택 위치로 설정 (디버거에서 호출 흐름 보기 쉽게)

📂 함수 호출 흐름 ① PRINT_MSG

call PRINT_MSG
  • PRINT_MSG 함수 호출 (메시지 출력용)

📂 두 값 중 큰 값 구하기 - 준비

mov eax, 10
mov ebx, 15
  • 비교할 두 값 준비 (eax=10, ebx=15)

📂 함수 호출 흐름 ② MAX

call MAX
  • MAX 함수 호출 → 두 값 비교 후 더 큰 값 반환

📂 반환값 출력

PRINT_DEC 4, ecx
NEWLINE
  • MAX 함수가 반환한 값을 10진수로 출력
  • ecx에 반환값이 담겨 있음

📂 종료 처리

xor rax, rax
ret
  • 반환값 0 설정 후 프로그램 종료

📂 함수 정의부 - 메시지 출력 함수

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 > ebxL1로 이동 → ecx = eax
eax <= ebxecx = ebx
공통ret로 복귀

📂 데이터 섹션

section .data
msg db 'Hello World', 0x00
  • 메시지 문자열 정의 (널 종료 포함)

📂 함수 호출 흐름 요약

단계설명
1call로 함수 호출
2함수 내부 작업 수행
3ret로 원래 위치 복귀

📂 함수 매개변수와 반환값 처리

항목처리 방식
매개변수eax, ebx에 전달 (레지스터 방식)
반환값ecx에 저장

📂 스택 없이 레지스터만 쓰는 방식의 단점

✅ 매개변수 10개 이상일 때 부족
✅ 다른 함수가 이미 사용하는 레지스터와 충돌 가능
✅ 중첩 함수 호출 시 데이터 관리 어려움

➡️ 스택 방식으로 개선 필요 (이후 학습 주제)


profile
李家네_공부방

0개의 댓글