Passing control : 함수호출-> 수행 -> 돌아옴. 수행할 위치, return point 필요


Passing data : 전달인자, return value 등이 포함


Memory management : 함수 호출시 메모리 할당, 리턴 시 메모리 반환



x86-64 Stack

- 높은 주소에서 낮은 주소로 확장됨

- register %rsp는 stack pointer저장(stack의 top을 가리킴)


x86-64 Stack : Push

- pushq Src:

1. 소스 읽음

2. %rsp 스택 포인터를 8만큼 미리 감소시킴

3. operand를 %rsp에 저장


x86-64 Stack : Pop

- pop Dest:

1. %rsp 스택포인터 에서 value 읽음

2. %rsp 스택 포인터를 8만큼 증가시킴

3. 읽은 value를 Dest에 저장함(이때 Dest는 register이다.)

- x86-64는 memory to memory transfer가 불가능하다. 따라서 stack은 memory에 있는 공간이므로, value를 메모리가 아닌 레지스터에 저장해야한다.


Procedure Control Flow : Passing control

- call과 return을 위해 stack사용

- call : call label

1. stack에 return address를 push

2. label로 jump

- return : ret

1. stack에서 return address를 pop (pop 후에 instruction register에 저장한다)

2. address로 jump


#1. %rsp는 현재 stack의 top을 가리키고있다. %rip는 다음 실행할 instruction 주소.

cpu는 한 cycle마다 %rip의 주소를 읽어와 수행한다.


#2. stack을 8byte만큼 감소시키고, return address를 저장한다.

다음에 실행할 주소는 mult2함수의 시작주소가 된다.


#3. %rip에 0x400557이 들어있다. 다음에 실행할 instruction은 return이다.


#4. %rsp 스택포인터가 가리키고 있는 return address를 %rip에 넣는다.

mult2함수가 종료 후 다시 돌아와 다음 instruction을 수행한다.



Procedure Data Flow : Passing data

가장 일반적으로 인자 넘겨주는 방법 : register사용

총 6개의 reg를 사용함 : %rdi, %rsi, %rdx, %rcx, %8, %r9

return value는 : %rax 사용

인자가 6개가 넘으면 stack을 사용한다.


Stack Frames

- stack frame pointer: %rbp(Optional) : 스택 프레임의 시작주소. 현재는 주로 일반적인 산술용도로 많이 쓰인다.

- stack pointer: %rsp : 스택의 가장 낮은 주소. (stack의 top을 가리킴)

- stack 공간 할당은 call instruction("Set-up" code) 에 의해서 push된다.

- stack 공간 반환은 ret instruction("Finish" code) 에 의해서 pop된다.



Register Saving Conventions

- yoo가 who를 호출할때, yoo는 caller, who는 callee가 된다.

- caller saved : 호출하는 함수가 register값을 안전히 저장하고 필요할 때 가져올 수 있어야함

- callee saved : 호출 되는 함수가 register값에 책임이 있다.



x86-64 Linux Register Usage

1. Caller saved

- %rax : return value, caller saved

- %rdi, %rsi, %idx, %rcx, %r8, %r9 : arguments, caller saved

- %r10, %r11 : caller saved, temporaries


2. Callee saved

- %rbx, %r12, %r13, %r14 : callee saved, callee must save & restore

- %rbp : callee saved, callee must save & restore, stack frame pointer로 사용가능

- %rsp : special form of callee saved, stack pointer




Posted by Jyoel :