ldmia A, B 명령어는 A 어드레스에서 B에 있는 레지스터의 개수만큼 순차적으로 읽어 B에 저장하는 역할을 하는 명령어입니다. ^^;;;

lr 뒤에 붙은 "!"는 ldmia를 수행하고 난 뒤에 lr 레지스터의 값을 변경하여, 읽은 레지스터의 개수만큼 어드레스를 증가시키라는 뜻입니다.

B의 명령어가 위처럼 { r0 - r12, pc }라면 A 어드레스부터 4byte * 14개를 읽어서 순차적으로 r0->r12, pc에 저장한다음, lr 레지스터의 값은 "lr = lr + 14 * 4" 되는 것이지요.

그리고 lr 뒤에 붙은 "^" 표시는 ldmia의 대상 레지스터로 pc가 지정되어 있는 경우, SPSR 레지스터의 값이 CPSR 레지스터로 복사가 됩니다.

코드를 보면 대충 눈치채셨겠지만... 예전에 만들었던 OS의 태스크 스위칭 코드의 일부입니다. ^^;; 지금음 오래되서 기억도 안나는데... LDMIA로 검색해서 들어오시는 분들이 꽤 되서 내용을 보강합니다. ^^

그럼 좋은 하루 되세요 ;)

ps) http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/BABEFCIB.html 로 가시면 ARM 명령어에 대한 자세한 설명을 보실 수 있습니다. ^^


아래는 원래 블로그에서 옮겨온 원본 글입니다. ^^;;;

===========================================================================================================
이 명령에서 제대로 실행이 안되고 뻣는 이유는... ㅡ_ㅡ;;;
도데체 무엇이란 말인가?? ㅡ_ㅡ;;;;;
분명 IRQ Mode이고 SPSR 레지스터도 잘 설정해 줬건만... 뻗어버리는 이유는.. ㅡ_ㅡ;;;;
으으.. ^를 빼면 그래도 스위칭하는데 별 문제가 없어보이는데....
것참 이상하네......
먼가 다른 이유가 있을것도 같은데, 쿨럭...;;;
어려워 어려워.. @0@/~~

+ Recent posts