"LDR and STR"의 두 판 사이의 차이

TRACE32
이동: 둘러보기, 검색
(새 문서: <p><span style="font-family: malgun; color: #ff0000;"><strong><span style="font-size: large;">* 작성중입니다</span></strong></span></p> <p> </p> <p><span style="font-family...)
 
2번째 줄: 2번째 줄:
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p><span style="font-family: malgun; color: #3366ff;"><strong><span style="font-size: large;">LDR and STR</span></strong></span></p>
 
<p><span style="font-family: malgun; color: #3366ff;"><strong><span style="font-size: large;">LDR and STR</span></strong></span></p>
<p><span style="font-family: malgun;">ARM은 메모리값의 연산을 위해 일반적으로 아래와 같은 순서로 작업하게 됩니다.</span></p>
+
<p><span style="font-family: malgun;">ARM은 메모리값의 연산을 위해 일반적으로 아래와 같은 순서로 동작합니다.</span></p>
<p style="padding-left: 30px;"><span style="font-family: malgun;">1. 메모리값을 레지스터로 읽어들인다 (Load)</span></p>
+
<p style="padding-left: 30px;"><span style="font-family: malgun;">1. 메모리값을 레지스터로 읽는다 (Load)</span></p>
 
<p style="padding-left: 30px;"><span style="font-family: malgun;">2. 레지스터에서 그 값을 변경한다</span></p>
 
<p style="padding-left: 30px;"><span style="font-family: malgun;">2. 레지스터에서 그 값을 변경한다</span></p>
<p style="padding-left: 30px;"><span style="font-family: malgun;">3. 변경된 값을 다시 메모리로 적어넣는다 (Store)</span></p>
+
<p style="padding-left: 30px;"><span style="font-family: malgun;">3. 변경된 값을 메모리에 쓴다 (Store)</span></p>
<p><span style="font-family: malgun;">이 과정에서 항상 메모리에서 값을 읽어오고 적어넣는 동작이 반복적으로 일어나고,</span></p>
+
<p>&nbsp;</p>
<p><span style="font-family: malgun;">대부분 타깃의 오류는 메모리에서 값을 읽고 쓰는 과정 중에 발생하게 됩니다.</span></p>
+
<p><span style="font-family: malgun;">대부분 타깃의 동작 오류는 이와 같은 메모리의 값을 읽고 쓰는 과정 중에 발생할 가능성이 큽니다.</span></p>
 
<p><span style="font-family: malgun;">그래서 아래에 Load &amp; Store 명령에 대해 간단히 소개해 보도록 하겠습니다.</span></p>
 
<p><span style="font-family: malgun;">그래서 아래에 Load &amp; Store 명령에 대해 간단히 소개해 보도록 하겠습니다.</span></p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
13번째 줄: 13번째 줄:
 
<p><span style="color: #3366ff; font-size: large;"><strong><span style="font-family: malgun;">LDR(Load register) :&nbsp;</span>메모리값을 레지스터로 복사합니다</strong></span></p>
 
<p><span style="color: #3366ff; font-size: large;"><strong><span style="font-family: malgun;">LDR(Load register) :&nbsp;</span>메모리값을 레지스터로 복사합니다</strong></span></p>
 
<p>아래는 LDR명령의 가장 기본적인 예 입니다.</p>
 
<p>아래는 LDR명령의 가장 기본적인 예 입니다.</p>
<p>0x0800_53E0 번지에서 4바이트를 읽어 R0로 복사하게 됩니다.</p>
+
<p>"LDR R0, 0x080053E0" 명령을 통해, 0x0800_53E0 번지에서 4바이트를 읽어 R0로 복사합니다.</p>
 +
<p style="padding-left: 30px;">&nbsp;</p>
 
<p style="padding-left: 30px;">실행전 :</p>
 
<p style="padding-left: 30px;">실행전 :</p>
 
<p style="padding-left: 30px;"><img src="/data/wiki/2015-04-30/1430360257.jpg" alt="" /></p>
 
<p style="padding-left: 30px;"><img src="/data/wiki/2015-04-30/1430360257.jpg" alt="" /></p>
21번째 줄: 22번째 줄:
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
<p><span style="font-family: malgun;">STR(Store register) :&nbsp;</span><span style="font-family: malgun;">레지스터 값을 메모리로 씁니다</span></p>
+
<p><span style="font-size: large; color: #3366ff;"><strong><span style="font-family: malgun;">STR(Store register) :&nbsp;</span><span style="font-family: malgun;">레지스터 값을 메모리로 씁니다</span></strong></span></p>
 
<p><span style="font-family: malgun;">STR은 LDR과 반대의 역할을 하는 명령어입니다.</span></p>
 
<p><span style="font-family: malgun;">STR은 LDR과 반대의 역할을 하는 명령어입니다.</span></p>
 +
<p><span style="font-family: malgun;">"STRH R0, [R1]" 명령을 통해 R0의 값인 0x40을 R1의 주소값인 0x2000_1C40 번지에 2바이트(Half Word) 적어주게 됩니다.</span></p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p><span style="font-family: malgun;">실행 전 :</span></p>
 
<p><span style="font-family: malgun;">실행 전 :</span></p>
<p><span style="font-family: malgun;"><img src="/data/wiki/2015-04-30/1430360967.jpg" alt="" /></span></p>
+
<p><img src="/data/wiki/2015-04-30/1430368899.jpg" alt="" /></p>
 +
<p>&nbsp;</p>
 +
<p>실행 후 :</p>
 +
<p><img src="/data/wiki/2015-04-30/1430369089.jpg" alt="" /></p>
 +
<p>&nbsp;</p>
 +
<p>이와 같이 LDR명령을 통해 메모리 값을 레지스터로 읽어오고,</p>
 +
<p>STR명령을 통해 레지스터 값을 메모리로 쓰는 것을 간단히 살펴보았습니다.</p>
 +
<p>&nbsp;</p>
 +
<p>그런데, 위의 LDR/STR명령을 보면,</p>
 +
<p>"LDR R0, <span style="color: #ff9900;"><strong>0x080053E0</strong></span>"<span>&nbsp;과 같이 두번째 인자(Operand2)가 상수값으로 오는 경우도 있지만,</span></p>
 +
<p><span>"STRH R0,&nbsp;<span style="color: #ff9900;"><strong>[R1]</strong></span>" 과 같이 레지스터가 오는 경우도 있습니다.</span></p>
 +
<p>&nbsp;</p>
 +
<p><span>또한&nbsp;"LDR R0,&nbsp;0x080053E0" 과 같이 4바이트를 접근하는 경우도 있지만,</span></p>
 +
<p><span>"STR<span style="color: #ff9900;"><strong>H</strong></span> R0,&nbsp;[R1]" 과 같이 2바이트를 접근하는 경우도 있습니다.</span></p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 +
<p><span>이들에 대해서는 이후에 추가로 알아보겠습니다.</span></p>

2015년 4월 30일 (목) 13:50 판

* 작성중입니다

 

LDR and STR

ARM은 메모리값의 연산을 위해 일반적으로 아래와 같은 순서로 동작합니다.

1. 메모리값을 레지스터로 읽는다 (Load)

2. 레지스터에서 그 값을 변경한다

3. 변경된 값을 메모리에 쓴다 (Store)

 

대부분 타깃의 동작 오류는 이와 같은 메모리의 값을 읽고 쓰는 과정 중에 발생할 가능성이 큽니다.

그래서 아래에 Load & Store 명령에 대해 간단히 소개해 보도록 하겠습니다.

 

 

LDR(Load register) : 메모리값을 레지스터로 복사합니다

아래는 LDR명령의 가장 기본적인 예 입니다.

"LDR R0, 0x080053E0" 명령을 통해, 0x0800_53E0 번지에서 4바이트를 읽어 R0로 복사합니다.

 

실행전 :

 

실행후 :

 

 

STR(Store register) : 레지스터 값을 메모리로 씁니다

STR은 LDR과 반대의 역할을 하는 명령어입니다.

"STRH R0, [R1]" 명령을 통해 R0의 값인 0x40을 R1의 주소값인 0x2000_1C40 번지에 2바이트(Half Word) 적어주게 됩니다.

 

실행 전 :

 

실행 후 :

 

이와 같이 LDR명령을 통해 메모리 값을 레지스터로 읽어오고,

STR명령을 통해 레지스터 값을 메모리로 쓰는 것을 간단히 살펴보았습니다.

 

그런데, 위의 LDR/STR명령을 보면,

"LDR R0, 0x080053E0" 과 같이 두번째 인자(Operand2)가 상수값으로 오는 경우도 있지만,

"STRH R0, [R1]" 과 같이 레지스터가 오는 경우도 있습니다.

 

또한 "LDR R0, 0x080053E0" 과 같이 4바이트를 접근하는 경우도 있지만,

"STRH R0, [R1]" 과 같이 2바이트를 접근하는 경우도 있습니다.

 

이들에 대해서는 이후에 추가로 알아보겠습니다.