안녕하세요~
arm쪽에 궁금한게 있어서 여기 질문하게 되었어요~
arm은 범용 레지스터가 r0~r15까지 총 16개가 있잖아요?
근데 c로 다양한 코드를 만들어서 컴파일 해보면.. 저 16개의 레지스터를 다채롭게 쓰지 않는것 같아요
대부분 r0~r3가 변수 레지스터 역할 다 하구요
fp ip sp가 스택 주소 관련해서 열심히 일하구요..
lr이랑 pc는 그들만의 분명한 영역이 존재하구요..
근데, 그 외의 레지스터는 거의.. 진짜 거의 하는일이 없는것 같아요
어셈블리어로 직접 작성한 코드의 경우에만 다채롭게 쓰고, c로 컴파일한 프로그램을 보면 거의 한정적으로 쓰는것 같아요
r4~r10은 거의 사용되지 않는것 같은데
이유가 따로 있나요???
댓글 5
-
쿨쿨
2013.07.06 08:20
-
은두
2013.07.08 01:29
저도 궁금해서 좀 찾아보았습니다.
Arm register들의 쓰임새를 정해놓은 가이드가 있는데, APCS 즉 Arm Procedure call standard 라고 합니다.(아래 pdf)
AAPCS : Procedure Call Standard for ARM Architecture 라고 요즘엔 불리네요.
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf
14~15 쪽에 보시면
Typically, the registers r4-r8, r10 and r11 (v1-v5, v7 and v8) are used to hold the values of a routine’s local
variables
라고 있는데요. 즉, 함수의 로컬변수용 레지스터에 주로 사용하는데 쿨쿨님이 말씀하신것 처럼..
callee 함수가 이 레지스터를 사용하려면 기존레지스터값을 스택에 저장후 사용하고, 함수가 끝나면 팝을 해서 복원을 시켜줍니다.
문서보니 이외에도 쓰임세가 있는것 같네요.
-
리누즈박
2013.07.08 02:11
이 글을 세 번 정도 봤는데 이제 이해 했습니다.
쿨쿨님 은두님 감사합니다.
-
유태희
2013.07.09 20:00
각자의 쓰임새가 명확히 존재하니까..
gcc도 그런 부분을 생각하고 컴파일 한것이겠지만..
그래도 r4~r10의 쓰임새에 대해서는 여전히 미스터리네요 ㅜㅜ
-
Ted
2013.07.15 10:43
백문이 불여일견이라고
직접 R4~R10 이 쓰여진 case를 직접 보시는게 어떨까 합니다.
assembly code로 작성한 코드가 아니라, 컴파일러에 의해 만들어지는 assembly code 말이죠...
(엄밀히 말하자면 기계어 코드지만, 뭐 어차피 assembly code와 1:1 로 연결되니까요....)
사실상 언제 어떻게 쓰여지느냐는 그냥 "이해"면 되지 않을까 싶네요.
이렇게 쓰였구나 하는 정도로...
컴파일러를 만들거나 공부하실 목적이 아니라면 "여기에 쓰였구나" 하는 정도로 충분하다고 생각합니다.
.
잠깐 커널 소스 컴파일 된 것을 보니 골고루 사용하는것 같은데요 ^^
C 컴파일러가 r0-r3을 많이 사용하는 것은 함수 호출시와 결과값 반환시에 r0-r3을 사용하기 때문일겁니다.
따라서 r0-r3은 함수에서 로컬변수처럼 자유롭게 사용할 수 있습니다.
반면에 나머지 레지스터들은 함수가 원래의 값을 보존해야 합니다.
스택에 푸시하고 사용했다가 팝을 하고 리턴을 해야하지요.
그렇기 때문에 컴파일러가 r0-r3 이외의 레지스터들은 되도록이면 적게 쓰려고 하지 않을까요?