함수 기초

namu·2022년 6월 29일

C++에서는 함수라는 용어를 사용하지만,
어셈블리 언어에서는 프로시저(procedure), 서브루틴(subroutine)이라는 용어를 사용한다. (언어마다 다름)

%include "io64.inc"

section .text
global CMAIN
CMAIN:
	; 함수 (프로시저 procedure 서브루틴 subroutine)
    
    call PRINT_MSG
    
    xor rax, rax ; 반환값 관련 레지스터, 정상적으로 반환 시 0으로 세팅
    ret

PRINT_MSG:
	PRINT_STRING msg
    NEWLINE
    ret
    
section. data
    msg db 'Hello World', 0x00

수학에서 함수는 입력값과 출력값이 있는 것인데,

; ex) 두 값 중 더 큰 값을 반환하는 max
; 근데 두 값을 어떻게 넘겨받지? 반환 어떻게?
; eax와 ebx 입력값을 ecx에 반환

	mov eax, 10
    mov ebx, 5
    call MAX
    PRINT_DEC 4, ecx
    NEWLINE

MAX:
	cmp eax, ebx
    jg L1
    mov ecx, ebx
    jump L2
L1:
	mov ecx, eax
L2:
	ret

그런데 인자가 10개라면 어떻게 할까? a b c d..
eax, ebx에 이미 중요한 값이 있으면 어떻게 할까?
.data .bss 사용하면? 그럼 또 인자를 도대체 몇개를 할당해야 하지?
데이터를 20개 정도 할당한 다음 함수들 끼리 돌려서 사용하는 경우에도, 함수 안에서 또 다른 함수를 호출해서 복잡한 호출 구조를 가질 수 있기 때문에 조금 애매함.

다른 메모리 구조가 필요하다

  • 꿈이 유효한 동안에는 그 꿈을 유지시켜야 함 (유효 범위의 개념이 있다. 인셉션)
  • 꿈이 끝나면 그 꿈을 부셔버려도 됨 (정리의 개념이 있다)
  • 꿈에서도 또 꿈을 꿀 수 있따는 것을 고려해야 함 (유동적으로 유효 범위가 확장 가능)

스택이라는 메모리 영역을 사용
함수가 사용하는 일종의 메모장

  • 매개변수 전달
  • 돌아갈 주소 관리
profile
안녕하세요

0개의 댓글