2013-03-12 4 views
1

Windows 용 ARM 크로스 어셈블러에서 예상치 못한 경고가 발생하고 있습니다. 경고를 일으키는 지시했다 :GNU ARM 어셈블러에서 예기치 않은 경고가 발생했습니다.

stmdb sp!,{r0-r14}^ 

ldmia sp!,{r0-r14}^ 

을 경고는 다음과 같습니다

은 경고 : 기본 레지스터의 되돌림은 예측할 수

내가 할 수있는 종류의 '^'수정자가 프로세서에 th를 저장하라고 알려주는 것처럼 이것을 이해하십시오. e 사용자 모드의 레지스터 복사본을 사용하면 명령이 실행될 때 프로세서가 어떤 모드에 있는지 알 수 없으며 명령을 알릴 방법이없는 것처럼 보입니다. 내가 명시 적으로 어떤 SP 레지스터를 저장하고 있지 않다는 사실에도 불구하고

ldmia sp!,{r0-r9,sl,fp,ip,lr}^ 

:

stmdb sp!,{r0-r9,sl,fp,ip,lr}^ 

과 : 나는에 대해 동일한 경고가 조금 더 걱정이었다.

내 관심사는 약 15 년 전에 어셈블러 코딩을 많이 했었지만 ARM 코드는 나에게 새로운 것이고 나는 오해를 불러 일으킬 수도 있다는 것이다. 또한 경고를 무시해도 안전하지 않은 경우 경고를 무시할 수 있습니까?

답변

1

(예외 리턴)

LDM{<amode>}<c> <Rn>{!},<registers_with_pc>^ 

LDM (사용자 등록), 그러나 ! 기호는 명령어가 값을 전송 영역 주소의 끝으로 업데이트한다고 가정합니다. 기본 레지스터 (SP) 값은 사용자 모드가 아닌 현재 모드에서 사용되므로 스택에 사용자 모드 SP 값을로드하거나 저장할 수 있습니다.

시스템 모드,로드 다중 (사용자 등록)를에서 주소를 사용하여 연속적인 메모리 위치 에서 로드 다중 사용자 모드 레지스터 이외의 PL1 모드에서 다음 ARM의 ARM의 B9.3.6의 LDM (사용자 등록)에서 기본 레지스터. 로드 된 레지스터에 PC가 포함될 수 없습니다. 프로세서는 현재 모드를 사용하여 기본 레지스터 값을 정상적으로 읽고 레지스터의 올바른 뱅크 된 버전을 결정합니다. 이 명령은 기본 레지스터에 다시 쓸 수 없습니다.

인코딩 다이어그램은 비트 21 (W, writeback)을 '(0)'으로 지정하여 비트가 0이 아닌 경우 결과를 예측할 수 없음을 나타냅니다.

따라서 해결책은 !을 지정하지 않고 필요한 경우 수동으로 SP를 감소 또는 증분하는 것입니다.

+0

아, 제가 건축 정보 레퍼런스 매뉴얼에서 그 부분을 놓쳤습니다. 비록 제가 ARM1176JZF-S 테크니컬 레퍼런스 매뉴얼을 제 정보에 많이 사용하고 있다는 것을 인정해야만합니다. Google을 사용하여 발견 한 경고의 모든 설명 (많지 않음!)은로드/저장중인 레지스터에 대한 쓰기 저장을 수행 중이므로 경고가 발생했다고 말합니다. 나는 writeback이 기본 레지스터의 갱신을 참조하는 것을 이해합니다. – williamssimonp

3

ARM 아키텍처 참조 설명서에 사용자 레지스터의 LDM/SMT에서 쓰기 저장이 허용되지 않는다고 나와 있습니다. 이 예외 목록은 pc이 레지스터 목록에있는 예외 반환 케이스에서 허용됩니다.

LDM 용어 "재기록"가 레지스터 목록 SP의 유무에 하지을 지칭

LDM{<amode>}<c> <Rn>,<registers_without_pc>^ 
+0

따라서 첫 번째 양식을 사용하여 예외를 반환하려면 쓰기 저장없이 레지스터를 저장하고 스택 포인터를 업데이트 한 다음 다시 쓰기 버전을 사용할 수 있습니다! 제한은 조금 이상하게 보입니다.하지만 이유가 있습니다. 적어도 PC가로드되는 경우 되돌릴 수 있습니다. 그렇지 않으면 쓸모가 없습니다! – williamssimonp

관련 문제