MDSTECH
TRACE32
TRACE32 Solution
TRACE32 Trace Solution
TRACE32 More Product
TRACE32 Software Solution
Why TRACE32?
교육신청
정규교육
교육과정 안내
교육장 안내
교육설문
자료실
TRACE32 소프트웨어
TRACE32 매뉴얼
iTSP
TRACE32 영상
인증서
고객지원
뉴스레터
Q&A
FAQ
원격지원
검색창
검색버튼
회원가입
로그인
TRACE32
TRACE32 Solution
TRACE32 Trace Solution
TRACE32 More Product
TRACE32 Software Solution
Why TRACE32?
교육신청
정규교육
교육과정 안내
교육장 안내
교육설문
자료실
TRACE32 소프트웨어
TRACE32 매뉴얼
iTSP
TRACE32 영상
인증서
고객 지원
뉴스레터
Q&A
FAQ
원격지원
사이트맵 보기
PUSH and POP 문서 원본 보기
←
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;">메모리에서 여러값을 읽어 레지스터로 복사하거나, 여러 레지스터의 값을 메모리로 쓸 수 있습니다.</span></p> <p> </p> <p><span style="font-family: malgun;">LDM/STM이 불특정 Rx를 기반으로 동작한다면, </span><span style="font-family: malgun;">PUSH/POP 명령은 스택포인터(R13)을 기준으로 동작합니다.</span></p> <p><span style="font-family: malgun;">PUSH는 결과적으로 "STMDB R13!", POP은 "LDMIA R13!" 와 동일한 의미를 갖습니다.</span></p> <p><span style="font-family: malgun;">자세한 것은 아래의 예를 통해 살펴보도록 하겠습니다.</span></p> <p> </p> <p> </p> <p><strong><span style="font-family: malgun; font-size: large; color: #3366ff;">PUSH : Push registers onto stack</span></strong></p> <p><span style="font-family: malgun;">스택포인터(R13)이 가리키는 메모리 번지로 부터</span></p> <p><span style="font-family: malgun;">0x4씩 차례로 주소를 감소시키면서 여러 레지스터 값을 쓰고,</span></p> <p><span style="font-family: malgun;">스택포인터는 그 사이즈 만큼 감소됩니다.</span></p> <p> </p> <p><span style="font-family: malgun;">아래의 PUSH {R3-R5,R14} 의 명령을 수행할 경우</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;">1. R14의 값인 0x0800_28E3은 R13-0x4 번지인 0x2000_2444 번지로 써 집니다</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;">2. R5의 값인 0x0은 R13-0x8 번지인 0x2000_2440 번지로 써 집니다</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;">3. R4의 값인 0x0은 R13-0xC 번지인 0x2000_243C 번지로 써 집니다</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;">4. R3의 값인 0x4000_0000은 R13-0x10 번지인 0x2000_2438 번지로 써 집니다</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;">5. R13은 0x10만큼 감소한 0x2000_2438 값으로 변경됩니다. (4바이트씩 4번 썼기 때문에)</span></p> <p> </p> <p style="padding-left: 30px;"><span style="font-family: malgun;">실행 전 :</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;"><img src="/data/wiki/2015-05-07/1430991807.jpg" alt="" /></span></p> <p> </p> <p style="padding-left: 30px;"><span style="font-family: malgun;">실행 후 :</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;"><img src="/data/wiki/2015-05-07/1430991815.jpg" alt="" /></span></p> <p> </p> <p> </p> <p> </p> <p><span style="color: #3366ff;"><strong><span style="font-family: malgun; font-size: large;">POP : Pop registers from stack</span></strong></span></p> <p><span style="font-family: malgun;">스택포인터(R13)이 가리키는 메모리 번지로부터</span></p> <p><span style="font-family: malgun;">0x4씩 주소값을 증가시키면서 차례로 레지스터 값을 메모리로 복사하고, 스택포인터는 그 사이즈 만큼 증가됩니다.</span></p> <p> </p> <p><span style="font-family: malgun;">아래의 POP {R1,PC} 를 실행한 결과,</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;">1. R13의 값인 0x2000_2430번지에서 4바이트(0x0)을 읽어 R1으로 복사합니다.</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;">2. R13+0x4주소의 값인 0x2000_2434번지에서 4바이트(0x0800_3325)를 읽어 PC로 복사합니다.</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;">3. PC(Program Counter)가 바뀌었으므로 결과적으로 분기한 효과가 발생합니다.</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;">4. 스택포인터(R13)은 원래의 값인 0x2000_2430에서 0x8만큼 증가한 0x2000_2438이 됩니다. (4바이트씩 2번 읽어왔으므로)</span></p> <p> </p> <p style="padding-left: 30px;"><span style="font-family: malgun;">실행 전 :</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;"><img src="/data/wiki/2015-05-07/1430991827.jpg" alt="" /></span></p> <p> </p> <p style="padding-left: 30px;"><span style="font-family: malgun;">실행 후 :</span></p> <p style="padding-left: 30px;"><span style="font-family: malgun;"><img src="/data/wiki/2015-05-07/1430992389.jpg" alt="" /></span></p> <p> </p> <p><span style="font-family: malgun;">이상으로 스택 연산을 위한 PUSH/POP 명령에 대해 살펴보았습니다.</span></p> <p><span style="font-family: malgun;">잘못된 점이나 추가 문의사항은 TRACE32@mdstec.com 으로 연락 부탁드립니다.</span></p> <p> </p> <p><span style="font-family: malgun;">"<strong><a href="/wiki/index.php/Cortex-M">TRACE32로 바라본 ARM - Cortex-M</a></strong>" 으로 돌아가기</span></p> <p> </p>
PUSH and POP
문서로 돌아갑니다.
둘러보기 메뉴
개인 도구
로그인
이름공간
문서
토론
변수
보기
읽기
원본 보기
역사 보기
행위
검색
TRACE32 Dummy
TRACE32
iTSP User's Guide
aTSP User's Guide
Linux Debugging
Debugging Tips
Trace Analysis
Virtual Target
TRACE32로 바라본 ARM
TRACE32 FAQ
TRACE32 Trouble Shooting
TRACE32 Software Update
Software Revision History
DT10 / DT-Win
다운로드
DT10 Evaluation
DT-Win Evaluation
TestPoint 삽입 Error
Build Error
DT10 FAQ
도구
여기를 가리키는 문서
가리키는 글의 바뀜
특수 문서 목록
문서 정보