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개 정도 할당한 다음 함수들 끼리 돌려서 사용하는 경우에도, 함수 안에서 또 다른 함수를 호출해서 복잡한 호출 구조를 가질 수 있기 때문에 조금 애매함.
다른 메모리 구조가 필요하다
스택이라는 메모리 영역을 사용
함수가 사용하는 일종의 메모장