2015-01-27 9 views
0

암 시스템 개발자 안내서의 다음 예는 명령어 전에 STM 증가 다음에 명령어 후 LDM 감소가 표시됩니다.레지스터 그룹을 저장하고 나중에 복원하는 방법은 무엇입니까?

PRE r0 = 0x00009000 
r1 = 0x00000009 
r2 = 0x00000008 
r3 = 0x00000007 
STMIB r0!, {r1-r3} 
MOV r1, #1 
MOV r2, #2 
MOV r3, #3 

PRE(2) r0 = 0x0000900c 
r1 = 0x00000001 
r2 = 0x00000002 
r3 = 0x00000003 
LDMDA r0!, {r1-r3} 
POST r0 = 0x00009000 
r1 = 0x00000009 
r2 = 0x00000008 
r3 = 0x00000007 

STMIB 명령은 값 7, 8, 9를 메모리에 저장합니다. 그런 다음 레지스터 r1에서 r3을 손상시킵니다. LDMDA은 원래 값을 다시로드하고 기본 포인터 r0을 복원합니다.

그러나 r1, r2, r3의 메모리는 1,2,3으로 덮어 씁니다. 그런 다음 이전 값이 어떻게 복원됩니까? 이전 값은 어디에 저장됩니까?

답변

0

LDM/STM (예제에서는 r0)의 첫 번째 피연산자는 기본 레지스터입니다. 이 레지스터는 레지스터 목록의 값이 저장 될 메모리의 주소를 보유합니다.

따라서, 예를 들어, 당신이 r0==0x9000STMIB r0!,{r1-r3} 당신이 0x9008에 주소 0x9004, r2에서 r1의 값을 저장하고, 0x900C에서 r3 것이다 때. 값이 0x9000인데, 이는 IB을 사용했기 때문에 (주소) 이전에 (저장/읽기)을 의미했기 때문에 값이 저장되지 않습니다.
!은 최종 주소 (0x900C)가 r0으로 다시 기록됨을 의미합니다.

그런 다음 LDMDA r0!,{r1-r3}을 실행하면 r0==0x900C으로 시작합니다. DA감소 후를 의미하므로 주소는 마침내 우리가로드 등록 후마다 감소되며, 가장 낮은 레지스터 때문에 항상 0x9008에서 다음 r2, 주소 0x900C에서 r3를로드하여 우리가 시작 낮은 메모리 주소로 전송/도착하고, r1부터 0x9004까지.

관련 문제