2007/10/19 - [임베디드/ARM] - ARM7 강좌 [10] : Instruction Set(4) (출처 : 디지털 동호회)
---------------------------------------------------------------------- ARM7 강좌 [11] : Instruction Set(5) ---------------------------------------------------------------------- * PSR Transfer 명령 기억하실런지 모르겠지만 PSR이란 Program Status Register 로서 플래그 비트와 Control 비트들로 구성된 레지스터입니다. 해당 레지스터의 값을 일반 레지스터로 옮기거나 반대의 일을 하는 명령이 PSR Transfer 명령입 니다. PSR은 32비트 레지스터입니다. CPSR과 SPSR 5개를 합쳐서 총 6개가 있습 니다. 여기서 SPSR 은 Exception모드에 따라 여분으로 존재하는 PSR을 말 합니다. 실행 모드에 따라서 유저가 접근할 수 있는 PSR은 한개, 혹은 2 개로 제한됩니다. 예를 들어 유저모드(보통모드)에서는 CPSR에만 접근 할 수 있고, IRQ모드에서는 CPSR과 SPSR_irq 에 접근할 수 있습니다. 여기서 잠깐 지난강좌의 내용을 떠올려 보죠. CPSR이라고 함은 일반적인 플래그 레지스터라고 생각하시면됩니다. 그런데, ARM7에서는 6개의 동작 모드가 있고, Exception(IRQ, FIQ, ABORT 등)에 의해 동작 모드가 전환됩 니다. 각 동작모드에 따라서 몇몇 레지스터들이 교체되고, 이 덕분에 각 모드별로 스택을 따로 관리할 수 있는 기능이 제공됩니다. Exception Call 에 따르는 수행번지 저장도 스택을 통해 하지 않고 r14(lr) 을 통해 수행합니다. 플래그 레지스터 역시 Exception에 따라 스택에 저장하지 않 아도 되도록 하는 기능을 제공해 주는데, 이런 역할을 하는 것이 SPSR입 니다. SPSR은 총 5개가 있습니다. 유저모드를 제외하고 나머지 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,: Transfer PSR contents to a register MSR{cond} ,Rm : Transfer register contents to PSR MSR{cond} ,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비트에 제한을 두어 사용할 경우엔 Imm- ediate 값을 사용할 수 있다고 합니다. 오늘 강좌는 간단하게 마치려고 합니다. 오랜만의 강좌라 기대를 많이 하신 분들이 혹(?) 계시다면 죄송하구요... 요즘들어 주변상황이 좀 어수선해서 조만간 다시 올리도록 하겠습니다.
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [10] : Instruction Set(4) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [9] : Instruction Set(3) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [8] : Instruction Set(2) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [7] : Instruction Set(1) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [6] : Exception(2) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [5] : Exception(1) (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [4] : 레지스터 (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 [3] : ARM7의 구조 (출처 : 디지털 동호회)
2007/10/19 - [임베디드/ARM] - ARM7 강좌 2 개요 (출처 : 디지털 동호회)
Hacked Brain/embeddedland.net