[CS] Assembly: Function
'컴퓨터 시스템 개론' 시리즈
✦ Memory Structure
◆ Stack
- stack 에 data 추가 → top 에서 변화 일어남

◆ push Instruction
pushsrc%rsp+ 8 → stack 공간 확보- 얻은 공간에 src 작성
- ex)
push %rax
◆ pop Instruction
popreg- reg 에 기존
%rsp저장되어 있던 값 저장 %rsp+ 8
- reg 에 기존
-
ex)
pop %rbx
- 여전히 memory 공간에는 값이 저장되어 있으나, 더 이상 사용 X
✦ Change of control-flow

- Example
- C code
multstore
- C code
void multstore(long *dest) {
long t = mult2(5L, 3L);
*dest = t;
}
→ Caller function : mult2 call
- `mult2`
long mult2(long a, long b) {
long s = a * b;
return s;
}
→ Callee function : mult2 에 의해 call 당함
- Asssembly
multstore
0000000000400536 <multstore>:
400536: push %rbx
400537: mov %rdi,%rbx
40053a: mov $0x3,%esi # Setup 2nd arg
40053f: mov $0x5,%edi # Setup 1st arg
400544: call 0x400550 <mult2> # mult2(5,3)
400549: mov %rax,(%rbx) # Update *dest
40054c: pop %rbx
40054d: ret
- `mult2`
0000000000400550 <mult2>:
400550: mov %rdi,%rax # %rax := a
400553: imul %rsi,%rax # %rax := a * b
400557: ret # Return
◆ Call to the entry of a function
callDestreturn address(call 명령어 다음 줄) stack 에 저장- stack 에
0x400544저장
- stack 에
0000000000400536 <multstore>:
...
400544: call 0x400550 <mult2> # mult2(5,3)
- Dest 로 jump
-
mult2로 이동
0000000000400536 <multstore>:
...
400544: call 0x400550 <mult2> # mult2(5,3)
400549: mov %rax,(%rbx) # Update *dest ; *dest = t
; mul2 가 계산 한 값 (%rax) 를 %rbx 가 가리키는 메모리에 저장
◆ Return to the call-site
ret- stack 에서 값 pop
- pop 된 값 (
return address) 로 jump =pop %rip와 동일
✦ Passing data
- 함수들 사이에 data 어떻게 전송 → promise
- argument 6개 (인자)
- %rdi
- %rsi
- %rdx
- %rcx
- %r8
- %r9
- return value (반환값)
- %rax
- argument 6개 (인자)
- Saved
- caller-saved
- callee 가 자유롭게 사용할 수 있는 register
- stack 에 따로 저장 X
- %rdi, $rsi, %rdx, %rcx, %r8 ~ %r11
- callee-saved
- callee 가 복원해야 하는 register
- 함수가 끝난 후에도 사용해야하는 register
- %rbx, %r12 ~ %r14
- caller 와 callee 는 상대적
- caller-saved
◆ Function arguments
void multstore(long *dest) {
long t = mult2(5L, 3L);
*dest = t;
}
0000000000400536 <multstore>:
400536: push %rbx
400537: mov %rdi,%rbx
40053a: mov $0x3,%esi # Setup 2nd arg
40053f: mov $0x5,%edi # Setup 1st arg
400544: call 0x400550 <mult2> # mult2(5,3)
400549: mov %rax,(%rbx) # Update *dest
40054c: pop %rbx
40054d: ret
- function argument
- %esi →
3저장 : 2nd argument - %edi →
5저장 : 1st argument
- %esi →
%rbx는 왜 push / pop 되는가?- 약속된 argument 값 아님 → 함수가 백업 & 복구해야 하는 값
multstore가 callee 입장.multstore시작 전 & 후 동일
◆ Return value
%rax→ caller-saved- return value 전달 용도 약속
call이전 값 보장 X, but return address 채워져 있다는 것은 보장
공유하기
Twitter Facebook LinkedIn글 이동
시리즈 이동
Comments