"PUSH and POP"의 두 판 사이의 차이
(새 문서: <p><span style="font-family: malgun;">LDM(load multiple registers), STM(store multiple registers) 명령을 통해,</span></p> <p><span style="font-family: malgun;">메모리에서...) |
(차이 없음)
|
2015년 5월 7일 (목) 18:58 판
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@mdstec.com 으로 연락 부탁드립니다.
"TRACE32로 바라본 ARM - Cortex-M" 으로 돌아가기