함수기초

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
%include "io64.inc"
 
section .text
global CMAIN
CMAIN:
    mov rbp, rsp; for correct debugging
 
    ; 함수 (프로시저 procedure 서브루틴 subroutine)
    
    ; 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
    
    ; ex) 두 값 주 ㅇ더 큰 값을 반환하느 max
    ; 근데 2값을 어떻게 남겨받지? 반환 어떻게?
    ; eax와 ebx 입력값을 ecx에 반환
 
MAX:
    cmp eax, ebx
    jg L1
    mov ecx, ebx
    jg L2
L1:
    mov ecx, eax
L2:
    ret        
    
    ; 그런데 인자가 10개라면 어떻게 할까? a b c d
    ; eax, ebx에 이미 중요한 값이 있으면 어떻게 할까?
    ; [!] .data .bss 사용하면?
    ; 인자를 도대체 몇개를 할당해야 하지?
    
    ; 다른 메모리 구조가 필요하다
    ; - 꿈의 유효한 동안에는 그 꿈을 유지시켜야 함.(유효 범위의 개념이 있다)
    ; - 꿈이 끝나면 그 꿈을 부셔버려도 됨 (정리의 개념이 있다)
    ; - 꿈에서도 또 꿈을 꿀 수 있다는 것을 고려해야 함 (유동적으로 유효 범위가 확장 가능)
    
    ; [!] 스택(stack)이라는 메모리 영역을 사용
    ; 함수가 사용하는 일종의 메모장
    ; - 매개 변수 전달
    ; - 돌아갈 주소 관리
    
    ; 초기화 되지 않은 데이터
    ;[변수이름] [크기] [개수]`
    ;[크기] resb(1) resw(2) resd(4) resq(8)
 
 section .data
    msg db 'Hello World'0x00
    
    
    ; 초기화 되지 않은 데이터
    ;[변수이름] [크기] [개수]`
    ;[크기] resb(1) resw(2) resd(4) resq(8)
 
 section .bss
    e resb 10
    
cs