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
원격지원
사이트맵 보기
LDM and STM 문서 원본 보기
←
LDM and STM
이동:
둘러보기
,
검색
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게만 가능합니다:
사용자
문서의 원본을 보거나 복사할 수 있습니다:
<p><span style="font-family: nanum;">LDR/STR이 메모리와 레지스터간에 데이터를 한번 이동하는 것이라면,</span></p> <p><span style="font-family: nanum;">LDM(load multiple register), STM(store multiple register)은 여러개의 데이터를 한번에 이동하는 것입니다.</span></p> <p> </p> <p><span style="font-family: nanum;">LDM/STM 뒤에는 IA(Increment address After each access) 혹은 DB(Decrement address Before each access)와 같은</span></p> <p><span style="font-family: nanum;"> </span><span style="font-family: nanum;">주소 증가/감소에 대한 모드가 표기되는데,</span></p> <p><span style="font-family: nanum;">주로 LDM은 IA와, STM은 DB와 쓰이는 것이 일반적입니다.</span></p> <p><span style="font-family: nanum;">LDM혹은 STM뒤에 별다른 표기가 없다면, "IA"가 생략되어 있다고 보시면 됩니다.</span></p> <p> </p> <p><span style="font-family: nanum;">그럼 아래의 예를 통해 LDM/STM의 동작을 살펴보겠습니다.</span></p> <p> </p> <p> </p> <p><span style="color: #3366ff; font-size: large;"><strong><span style="font-family: nanum;">LDM : load multiple register</span></strong></span></p> <p><span style="font-family: nanum;">메모리에서 여러개의 데이터를 레지스터로 복사합니다.</span></p> <p><span style="font-family: nanum;">바이트(8-bit)/하프워드(16-bit) 복사는 없고 무조건 워드(32-bit) 복사만 존재합니다.</span></p> <p><span style="font-family: nanum;">기존에 LDR(load register) 명령을 알고 있는 분이라면 복사 방향이 반대임에 유의하시기 바랍니다.</span></p> <p> </p> <p><span style="font-family: nanum;">아래의 "LDM R1!, {R3,R12}" 명령에서 미리 알아야 할 것은 아래와 같습니다.</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span>1. R1의 주소에서 값을 차례로 읽어 R3, R12로 복사합니다.</p> <p style="padding-left: 30px;">2. "LDM"은 "LDMIA"와 동일하니, 매번 읽을때마다 주소값은 증가합니다.</p> <p style="padding-left: 30px;">3. "R1" 뒤에 붙어있는 "!"는 연산 결과 후 R1값이 자동으로 변경됨을 의미합니다.</p> <ol> </ol> <p> </p> <ul> </ul> <p> </p> <p><span style="font-family: nanum;">그 결과,</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span>1. R1의 주소(0x0800_4C48)번지에서 4바이트(0x3D20_3220)를 읽어 R3으로,</p> <p style="padding-left: 30px;">2. R1의 주소에서 4증가한 번지(0x0800_4C4C)에서 4바이트(0x4D38_3420)를 읽어 R12로 복사합니다.</p> <p style="padding-left: 30px;">3. R1은 8바이트(4바이트씩 2번 읽어 왔으므로) 증가한 0x0800_4C50이 됩니다.</p> <ol> </ol> <p> </p> <ul> </ul> <p><span style="font-family: nanum;">아래의 스크린샷을 통해 확인해 보시기 바랍니다.</span></p> <p> </p> <p style="padding-left: 30px;"><span style="font-family: nanum;">실행 전 :</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"><img src="/data/wiki/2015-05-07/1430971651.jpg" alt="" /></span></p> <p> </p> <p style="padding-left: 30px;"><span style="font-family: nanum;">실행 후 :</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"><img src="/data/wiki/2015-05-07/1430971661.jpg" alt="" /></span></p> <p> </p> <p> </p> <p><span style="font-size: large; color: #3366ff;"><strong><span style="font-family: nanum;">STM : store multiple register</span></strong></span></p> <p><span style="font-family: nanum;">여러개의 레지스터값을 메모리로 복사합니다.</span></p> <p><span style="font-family: nanum;">바이트(8-bit)/하프워드(16-bit) 복사는 없고 무조건 워드(32-bit) 복사만 존재합니다.</span></p> <p><span style="font-family: nanum;">기존에 STR(store register) 명령을 알고 있는 분이라면 복사 방향이 반대임에 유의하시기 바랍니다.</span></p> <p> </p> <p><span style="font-family: nanum;">아래의 "STMDB R0!, {R2-R5}" 명령에서 미리 알아야 할 것은,</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span><span style="font-family: nanum;">1. R2 ~ R5의 값을 R0가 가리키는 메모리 번지로 차례로 복사합니다.</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span><span style="font-family: nanum;">2. "DB" suffix가 붙었으므로 매번 복사할때 마다 주소값은 0x4씩 감소됩니다.</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span><span style="font-family: nanum;">3. "R0" 뒤에 붙어있는 "!"는 연산 결과 후 R0값이 자동으로 변경됨을 의미합니다.</span></p> <ul> </ul> <p> </p> <p><span style="font-family: nanum;">그 결과,</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span><span style="font-family: nanum;">1. R5의 값인 0x55가 R0에서 0x4만큼 감소한 0x2000_1B74 번지로,</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span><span style="font-family: nanum;">2. R4의 값인 0x44가 R0에서 0x8만큼 감소한 0x2000_1B70 번지로,</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span><span style="font-family: nanum;">3. R3의 값인 0x33가 R0에서 0xC만큼 감소한 0x2000_1B6C 번지로,</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span><span style="font-family: nanum;">4. R2의 값인 0x22가 R0에서 0x10만큼 감소한 0x2000_1B68 번지로 차례로 복사됩니다.</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"> </span><span style="font-family: nanum;">5. R0값이 (4바이트씩 4번 읽어 왔으므로)0x10만큼 감소한 0x2000_1B68로 변경됩니다.</span></p> <ul> </ul> <p> </p> <p><span style="font-family: nanum;">아래의 스크린샷을 통해 확인해 보시기 바랍니다.</span></p> <p> </p> <p style="padding-left: 30px;"><span style="font-family: nanum;">실행 전 :</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"><img src="/data/wiki/2015-05-07/1430974696.jpg" alt="" /></span></p> <p> </p> <p style="padding-left: 30px;"><span style="font-family: nanum;">실행 후 :</span></p> <p style="padding-left: 30px;"><span style="font-family: nanum;"><img src="/data/wiki/2015-05-07/1430974703.jpg" alt="" /></span></p> <p> </p> <p> </p> <p><span style="color: #3366ff; font-size: large;"><strong>STM은 "DB", LDM은 "IA"와 주로 사용되는 이유</strong></span></p> <p>앞에서 address mode에 IA/DB가 있지만,</p> <p>주로 IA는 LDM과, DB는 STM과 같이 사용된다고 말씀드렸습니다.</p> <p> </p> <p>그 이유는, STM/LDM이 주로 메모리 복사나, 레지스터값의 임시저장(스태킹) 용도로 쓰이다 보니,</p> <p>아래와 같은 Full Descending stack 방식을 사용하기 때문입니다.</p> <p style="padding-left: 30px;"><img src="/data/wiki/2015-05-07/1430977922.jpg" alt="" /></p> <p> </p> <p> </p> <p> </p> <p><span style="font-family: nanum;">이와같이 메모리와 레지스터간에 여러개의 데이터를 주고 받는 LDM/STM 명령에 대해 간단히 살펴보았습니다.</span></p> <p><span style="font-family: nanum;">잘못된 점이나 추가 문의사항은 TRACE32@hancommds.com 으로 연락 부탁드립니다.</span></p> <p> </p> <p><span style="font-family: nanum;">"<strong><a href="/wiki/index.php/Cortex-M">TRACE32로 바라본 ARM - Cortex-M</a></strong>" 으로 돌아가기</span></p>
LDM and STM
문서로 돌아갑니다.
둘러보기 메뉴
개인 도구
로그인
이름공간
문서
토론
변수
보기
읽기
원본 보기
역사 보기
행위
검색
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
도구
여기를 가리키는 문서
가리키는 글의 바뀜
특수 문서 목록
문서 정보