● PSR Transfer 명령
기억하실지 모르겠지만 PSR이란 Program Status Register로서 플래그 비트와 Control 비트들로 구성된 레지스터입니다. 해당 레지스터의 값을 일반 레지스터로 옮기거나 반대의 일을 하는 명령이 PSR Transfer 명령입니다.
PSR은 32비트 레지스터입니다. CPSR과 SPSR 5개를 합쳐서 총 6개가 있습니다. 여기서 SPSR 은 Exception모드에 따라 여분으로 존재하는 PSR을 말합니다. 실행 모드에 따라서 User가 접근할 수 있는 PSR은 한 개, 혹은 2개로 제한됩니다. 예를 들어 User모드(보통모드)에서는 CPSR에만 접근 할 수 있고, IRQ모드에서는 CPSR과 SPSR_irq 에 접근할 수 있습니다.
여기서 잠깐 지난 강좌의 내용을 떠올려 보죠. CPSR이라고 함은 일반적인 플래그 레지스터라고 생각하시면 됩니다. 그런데, ARM7에서는 6개의 동작 모드가 있고, Exception(IRQ, FIQ, ABORT 등)에 의해 동작 모드가 전환됩니다. 각 동작모드에 따라서 몇몇 레지스터들이 교체되고, 이 덕분에 각 모드별로 스택을 따로 관리할 수 있는 기능이 제공됩니다. Exception Call에 따르는 수행번지 저장도 스택을 통해 하지 않고 r14(lr)을 통해 수행합니다. 플래그 레지스터 역시 Exception에 따라 스택에 저장하지 않아도 되도록 하는 기능을 제공해 주는데, 이런 역할을 하는 것이 SPSR 입니다. SPSR은 총 5개가 있습니다. User모드를 제외하고 나머지 5개의 동작 모드마다 하나씩 존재하는데요.
예를 들어 IRQ가 걸렸다고 하면, 우선 CPU동작모드 IRQ 모드로 바뀌고 이에 따라 r13_irq, r14_irq 로 레지스터 2개가 대치됩니다. 다음 r14_irq에 기존의 pc(r15)값을 저장합니다. 다음 지정된 벡터로 이동하겠죠. 이때 플래그레지스터, 즉 CPSR의 값도 보전할 필요가 있죠. 그래서 하는 일이 CPSR값을 pc와 비슷한 메커니즘으로 SPSR_irq로 넣어두는 것입니다. r13_irq와는 좀 차이가 있죠. r13과 같은 범용 레지스터들은 각 수행모드 별로 그 값이 계속 유지가 됩니다만, SPSR이나 r14는 Exception시에 기존 레지스터 값의 보관을 위해 사용되는 버퍼 역할을 합니다.
어떻든 간에... 오늘 설명할 명령어는 두가지입니다. 사실 그다지 쓰일 일은 없고, CPU동작모드를 임의로 설정하거나, 현재 동작모드를 확인하기 위해서 사용되는 경우가 있습니다.
1) MRS{cond} Rd,<psr> : Transfer PSR contents to a register
MSR{cond} <psr>,Rm : Transfer register contents to PSR
MSR{cond} <psrf>,Rm : Transfer register contents to PSR
flag bits only
MRS명령과 MSR명령의 의미가 헛갈릴 수 도 있는데요, M을 Move로, R을 레지스터로, S를 PSF로 파악하면, MRS의 경우엔 Move Reg,PSR이 정도로 생각할 수 있습니다. 즉, 레지스터에 PSR값을 넣는 명령이죠. MSR의 경우엔 반대로 생각 할 수 있습니다.
참고로 CPSR의 컨트롤비트를 바꾸면 CPU의 동작모드를 임의로 설정할 수 있습니다만, USER모드에서는 해당 기능을 사용할 수 없습니다.
Ex1) MSR CPSR_all,r0
: 해당 명령이 USER모드에서 수행되었다면 Control Bit들은 영향을 받지 않고 Flag Bits[31:28]만 영향을 받습니다.
만약 USER모드를 제외한 다른 모드에서 수행되었다면 CPSR의 모든 비트들이 변화하게 됩니다.
Ex2) MSR CPSR_flg,r0
: CPSR에 접미사 _flg를 붙여주어서 모드에 상관없이 Flag 비트들만 영향을 받도록 합니다.
Ex3) MRS r0,CPSR
: CPU동작모드에 상관없이 CPSR의 모든 비트들을 r0로 복사합니다.
Ex4) MSR SPSR_all,r0
: r0의 값을 SPSR의 모든 비트에 반영합니다. 해당 명령은 USER모드에서는 수행 불가능합니다. USER모드에서는 접근 가능한 SPSR 자체가 없기 때문입니다.
Ex5) MSR SPSR_flg,#0xC0000000
: SPSR의 N, Z플래그를 세트하고 C, V플래그를 클리어 하는 명령입니다. 위와 같이 MSR명령을 Flag비트에 제한을 두어 사용할 경우엔 Immediate 값을 사용할 수 있다고 합니다.
오늘 강좌는 간단하게 마치려고 합니다. 오랜만의 강좌라 기대를 많이 하신 분들이 혹(?) 계시다면 죄송하고요. 요즘 들어서 주변상황이 좀 어수선해서 조만간 다시 올리도록 하겠습니다.