카테고리 없음

[π-OS] 만들다가... LDM Instruction의 오류....

벅스바니 2010. 1. 30. 00:59
시스템 명령어들은 간만에 쓰니까 까먹어버렸습니다.
오늘 하루동안 이거하나로 시간 다 잡아먹었습니다.
커널코딩은 다 끝났는데 말이죠.

문제는 1번 구문과 2번 구문입니다.

1번)
ldmia r8,{r0-r15}^

2번)
ldmia r8!,{r0-r14}^
ldmia r8 ,{pc}^

두개는 완전히 다른 기능을 합니다.
PC가 없을 경우의 ^(carrot)은 USER/SYSTEM 모드 레지스터에 넣는 명령어이지만
PC가 있을 경우는 '^'는 SPSR을 CPSR에 넣으라는 의미가 됩니다.

때문에 1번은 User/System 모드의 레지스터가 아닌 현재 레지스터에 격납하고, SPSR을 CPSR에 넣기만합니다.
그러나 2번은 r0~R14의 레지스터는 User/System레지스터에 격납하고, 두번째 명령어에서
해당 모드의 PC값으로 뛴다는 것입니다.

하도 오래간만에 하다보니, 새로 보는 것 같습니다.

제가 ARM7TDMI 계열 프로그래밍할 때 보는 책은
"Addison Wesley - ARM Architecture Reference Manual (2nd Edition)" (ARM DDI 0100E)

입니다.

일단 위의 부분 수정후 잘 돌아가고 있습니다.
하루를 잡아먹은 일이 해결되니 답답함이 좀 풀렸네요.