여러 가지 register가 있고, 그 각각의 목적에 대해서 알아보기 위해 포스팅한다.
우선 크게 두가지로 나눌 수 있는데, caller-saved와 callee-saved이다.
Caller-saved와 Callee-saved에 대해서
caller-saved는 간단하게 말해서, 값이 바뀌더라도 별 신경을 쓰지 않아도 되는 register들이다
caller-saved에 들어가는 register는 (r사이즈 기준) %rax, rdi, rsi, rdx, rcx, r8~r11이다.
callee-saved는 다른 함수를 통과하고 난뒤 변화하면 안되는 register이다. (그 함수 내에서 변화하는건 괜찮다)
얘를들어, main함수내에 sum이라는 함수가 있다고 쳤을때, 나왔을때 이 register들의 값은 그대로여야 한다.
방법은 크게 두가지인데, 1번은 아예 건드리지 않고, 있는 값만 가져오는 방식이고
(보통 다른 레지스터를 추가해야 하는 상황에서는 잘 사용하지 않음)
2번은 stack에 원래값을 넣어둔뒤, 수정후 함수가 끝날때 pop으로 다시 가져오는 방식이다.
x86-stack에 대해서는 추후 포스팅할 예정이니 다음 포스팅 참조.
Callee-saved에 들어가는 register는 (r사이즈 기준) %rbx, rbp, r12~r14, rsp이다.
각 레지스터들의 기능
1. %rax caller-saved
모든 함수의 return값을 담당한다. retq가 되었을때 반환되는 값들은 전부 rax라고 생각하면 된다.
2. %rdi~r9 caller-saved
함수를 호출할때 넘겨주는 매개변수를 담당한다. 만약 매개변수가 6개를 넘는 함수인경우, stack주소를 의미하는 %rsp를 이용하여 stack에 매개변수를 넣어두고 사용한다.
순서는 rdi, rsi, rdx, rcx, r8, r9 순이다. (상단의 이미지에도 나와있다)
3. %r10~r11 caller-saved
특별한 용도없음, 주로 함수내에서 아무렇게나 쓰고 버릴 수 있는 지역변수로 사용함. 단 r11은 linking으로도 사용함(우리 level에서는 중요하지 않음)
4. %rsp callee-saved
Stack의 top주소를 의미하며, 한 함수내에서 rsp값은 바뀔 수 있어도, 모든 지역변수를 제거하여 rsp가 다시 원상태로 돌아와야 하기 때문에 rsp는 callee-saved이다.
5. %rbx, %rbp, %r12~r15 callee-saved
이들은 callee-saved값으로, 다른함수를 갔다와도 바뀌지 않아야하는 값을 이 register에 넣는다, 재귀함수의 탈출조건이 대표적인 예시가 될 수 있겠다. (선언한 함수 내에서 바뀌는 것은 상관없다) (%r12의 경우 C언어 에서는 사용하지 않는다)
6. %rip
위 이미지에도 없고 caller, callee로도 구별되지 않지만 중요한 레지스터. 이 레지스터에는 현재 명령이 실행되고있는 명령줄의 주소가 들어가있다. 이게 증가하면서 함수가 진행되고, 이게 jmp되면서 주소가 바뀌면, 다른 함수로 넘어가게 된다.
'컴퓨터 시스템' 카테고리의 다른 글
mov와 lea의 비교, 어셈블리 접미사의 의미(q, l, w,b) (0) | 2021.10.28 |
---|---|
어셈블리 operations 모음 (0) | 2021.10.15 |
실수의 저장 방식 (0) | 2021.10.04 |
비트연산과 정수 - 연산 꿀팁 (0) | 2021.10.01 |
비트연산과 정수정리 (0) | 2021.09.27 |