PUSH and POP

TRACE32
이동: 둘러보기, 검색

LDM(load multiple registers), STM(store multiple registers) 명령을 통해,

메모리에서 여러값을 읽어 레지스터로 복사하거나, 여러 레지스터의 값을 메모리로 쓸 수 있습니다.

 

LDM/STM이 불특정 Rx를 기반으로 동작한다면, PUSH/POP 명령은 스택포인터(R13)을 기준으로 동작합니다.

PUSH는 결과적으로 "STMDB R13!", POP은 "LDMIA R13!" 와 동일한 의미를 갖습니다.

자세한 것은 아래의 예를 통해 살펴보도록 하겠습니다.

 

 

PUSH : Push registers onto stack

스택포인터(R13)이 가리키는 메모리 번지로 부터

0x4씩 차례로 주소를 감소시키면서 여러 레지스터 값을 쓰고,

스택포인터는 그 사이즈 만큼 감소됩니다.

 

아래의 PUSH {R3-R5,R14} 의 명령을 수행할 경우

1. R14의 값인 0x0800_28E3은 R13-0x4 번지인 0x2000_2444 번지로 써 집니다

2. R5의 값인 0x0은 R13-0x8 번지인 0x2000_2440 번지로 써 집니다

3. R4의 값인 0x0은 R13-0xC 번지인 0x2000_243C 번지로 써 집니다

4. R3의 값인 0x4000_0000은 R13-0x10 번지인 0x2000_2438 번지로 써 집니다

5. R13은 0x10만큼 감소한 0x2000_2438 값으로 변경됩니다. (4바이트씩 4번 썼기 때문에)

 

실행 전 :

 

실행 후 :

 

 

 

POP : Pop registers from stack

스택포인터(R13)이 가리키는 메모리 번지로부터

0x4씩 주소값을 증가시키면서 차례로 레지스터 값을 메모리로 복사하고, 스택포인터는 그 사이즈 만큼 증가됩니다.

 

아래의 POP {R1,PC} 를 실행한 결과,

1. R13의 값인 0x2000_2430번지에서 4바이트(0x0)을 읽어 R1으로 복사합니다.

2. R13+0x4주소의 값인 0x2000_2434번지에서 4바이트(0x0800_3325)를 읽어 PC로 복사합니다.

3. PC(Program Counter)가 바뀌었으므로 결과적으로 분기한 효과가 발생합니다.

4. 스택포인터(R13)은 원래의 값인 0x2000_2430에서 0x8만큼 증가한 0x2000_2438이 됩니다. (4바이트씩 2번 읽어왔으므로)

 

실행 전 :

 

실행 후 :

 

이상으로 스택 연산을 위한 PUSH/POP 명령에 대해 살펴보았습니다.

잘못된 점이나 추가 문의사항은 TRACE32@hancommds.com 으로 연락 부탁드립니다.

 

"TRACE32로 바라본 ARM - Cortex-M" 으로 돌아가기