ARM Cortex-M3 베어 메탈에서 컴파일 된 프로그램을 실행하려고합니다. 시스템이 응용 프로그램 코드에 도달하기 전에 홀수 오류가 발생하면 프로그램 카운터가 사라지고 오류가 발생합니다.LDMIA 명령어로 인해 레지스터 데이터가 손상됩니다.
는 명령 전에 레지스터 것으로 관찰된다
r0 0x0 0
r1 0x1 1
r2 0x0 0
r3 0x2 2
r4 0x18564 99684
r5 0x18418 99352
r6 0x0 0
r7 0x0 0
r8 0x8311 33553
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0xc84404 13124612
sp 0x7ffe0 0x7ffe0
lr 0x80df 32991
pc 0x8380 0x8380
다음 명령이 실행된다 명목상 :
0x829c <__call_exitprocs+112>: ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
그리고 레지스터 폭발 판독된다. 또한 프로그램 카운터를 끄고 효과적으로 프로그램을 종료합니다.
...
r3 0x2 2
r4 0xffffffff 4294967295
r5 0xffffffff 4294967295
r6 0xffffffff 4294967295
r7 0xffffffff 4294967295
r8 0xffffffff 4294967295
r9 0xffffffff 4294967295
r10 0xffffffff 4294967295
r11 0x0 0
...
pc 0xfffffffe 0xfffffffe
나는 a similar issue on stack overfflow을 읽었습니다,하지만 내가 여기에 직면하고있어 직접적인 문제가 될 것 같지 않습니다. The ATMEL documentation for this board은 한 번에 읽을 수있는 내부 레지스터 수에 대한 제한을 지정하지 않습니다.
문제에 대한 의견 및 가능한 경우 gcc의 문제를 예방하는 방법은 무엇입니까?
'ldmia'가 스택에서로드되고 스택에 무엇이 있는지 표시하지 않았습니다. 스택의 데이터가 손상되면 명령이 제대로 작동 할 수 있습니다. – Jester
thumb 명령은 많은 레지스터를 허용하지 않지만 thumb2 (armv7m) 확장은 허용합니다. 디스어셈블러는 텍스트가 무엇인지 가정하고 그렇지 않으면 모든 레지스터를 보여주지 않을 것입니다. 그리고 당신이 스스로 지적했듯이, PC가 나쁘다. 그래서 ldmia가 pc를 수정하고있다. Jester가 지적한 pc가 아마 스택에 좋지 않을 것이다. 명령 앞에 스택을 덤프하고 무엇이 들어 있는지 확인하십시오. –
명령어 앞에 'sp 0x7ffe0' 만 중요합니다. 왜 다른 레지스터를 게시했는지 확신 할 수 없습니다. 대신에 "stmia"를 쌓아 올리기를 원하지 않았습니까? 그렇지 않다면, 앞의 코드는 이미 충분한 값을 스택에 넣어야합니다. – Ped7g