공부하면서 어떤 레지스터가 어떻게 사용되는지 많이 궁금했었죠
아래 리플로 쓰기는 했는데 계속 찾아볼 수 록 여러 정보가 나오게 되서 함 정리를 해봅니다.
제가 알기론 PowerPC GPRs들을 이용하여 다양하게 사용될 수 있다는 겁니다.
그러나 기준이 없으면 여러 컴파일러들이 중구난방으로 만들어 질꺼 같죠? 역시 찾아보니 자료가 나오더군요.
PowerPC는 32bit와 64bit로 나뉘는데요 linux PowerPC 32bit는 SVR4 (System V R4) ABI를 사용하지만 64bit는 AIX를 따르며 PowerOpen ABI를 이용한다고 합니다.
그러나 어떤 사이트에 게시판 글들을 보면 "Embedded PowerPC용 컴파일러라면, 반드시 PowerPC EABI의 규칙을 따라야 합니다."라는 말이 있더군요. 덧붙이자면 PowerPC EABI가 대세입니다라고 합니다.
그래서 IBM 사이트에서 찾아보면 PPC-elf64abi.txt파일이 있습니다. 웃긴건 엄청난 글과 그림을 txt파일로 표현했다는 것.... 왜 이런 삽질을 했는가 아벰은...
발췌를 해보면
3.2.1. Registers
The 64-bit PowerPC Architecture provides 32 general purpose registers,
each 64 bits wide. In addition, the architecture provides 32
floating-point registers, each 64 bits wide, and several special
purpose registers. All of the integer, special purpose, and
floating-point registers are global to all functions in a running
program. The following table shows how the registers are used.
r0 Volatile register used in function prologs
r1 Stack frame pointer
r2 TOC pointer
r3 Volatile parameter and return value register
r4-r10 Volatile registers used for function parameters
r11 Volatile register used in calls by pointer and as an
environment pointer for languages which require one
r12 Volatile register used for exception handling and glink code
r13 Reserved for use as system thread ID
r14-r31 Nonvolatile registers used for local variables
f0 Volatile scratch register
f1-f4 Volatile floating point parameter and return value registers
f5-f13 Volatile floating point parameter registers
f14-f31 Nonvolatile registers
LR Link register (volatile)
CTR Loop counter register (volatile)
XER Fixed point exception register (volatile)
FPSCR Floating point status and control register (volatile)
CR0-CR1 Volatile condition code register fields
CR2-CR4 Nonvolatile condition code register fields
CR5-CR7 Volatile condition code register fields
On processors with the VMX feature.
v0-v1 Volatile scratch registers
v2-v13 Volatile vector parameters registers
v14-v19 Volatile scratch registers
v20-v31 Non-volatile registers
vrsave Non-volatile 32-bit register
라고 돼어 있네요.
과연 linux는 이 포맷을 따랐나요? 라는 질문엔 답변을 해드릴수 없습니다. 확인해보지 않어서 ㅡㅜ
아래 리플로 쓰기는 했는데 계속 찾아볼 수 록 여러 정보가 나오게 되서 함 정리를 해봅니다.
제가 알기론 PowerPC GPRs들을 이용하여 다양하게 사용될 수 있다는 겁니다.
그러나 기준이 없으면 여러 컴파일러들이 중구난방으로 만들어 질꺼 같죠? 역시 찾아보니 자료가 나오더군요.
PowerPC는 32bit와 64bit로 나뉘는데요 linux PowerPC 32bit는 SVR4 (System V R4) ABI를 사용하지만 64bit는 AIX를 따르며 PowerOpen ABI를 이용한다고 합니다.
그러나 어떤 사이트에 게시판 글들을 보면 "Embedded PowerPC용 컴파일러라면, 반드시 PowerPC EABI의 규칙을 따라야 합니다."라는 말이 있더군요. 덧붙이자면 PowerPC EABI가 대세입니다라고 합니다.
그래서 IBM 사이트에서 찾아보면 PPC-elf64abi.txt파일이 있습니다. 웃긴건 엄청난 글과 그림을 txt파일로 표현했다는 것.... 왜 이런 삽질을 했는가 아벰은...
발췌를 해보면
3.2.1. Registers
The 64-bit PowerPC Architecture provides 32 general purpose registers,
each 64 bits wide. In addition, the architecture provides 32
floating-point registers, each 64 bits wide, and several special
purpose registers. All of the integer, special purpose, and
floating-point registers are global to all functions in a running
program. The following table shows how the registers are used.
r0 Volatile register used in function prologs
r1 Stack frame pointer
r2 TOC pointer
r3 Volatile parameter and return value register
r4-r10 Volatile registers used for function parameters
r11 Volatile register used in calls by pointer and as an
environment pointer for languages which require one
r12 Volatile register used for exception handling and glink code
r13 Reserved for use as system thread ID
r14-r31 Nonvolatile registers used for local variables
f0 Volatile scratch register
f1-f4 Volatile floating point parameter and return value registers
f5-f13 Volatile floating point parameter registers
f14-f31 Nonvolatile registers
LR Link register (volatile)
CTR Loop counter register (volatile)
XER Fixed point exception register (volatile)
FPSCR Floating point status and control register (volatile)
CR0-CR1 Volatile condition code register fields
CR2-CR4 Nonvolatile condition code register fields
CR5-CR7 Volatile condition code register fields
On processors with the VMX feature.
v0-v1 Volatile scratch registers
v2-v13 Volatile vector parameters registers
v14-v19 Volatile scratch registers
v20-v31 Non-volatile registers
vrsave Non-volatile 32-bit register
라고 돼어 있네요.
과연 linux는 이 포맷을 따랐나요? 라는 질문엔 답변을 해드릴수 없습니다. 확인해보지 않어서 ㅡㅜ
.