본문 바로가기

학교/시스템 프로그래밍

LDR / STR Indexing

기본 사용방법

LDR | STR rd, [rn], [<offset>] { ! }

 

그냥 이걸 보기 편하게 하면 포인터와 &라고 보면 된다.

여기서 대략적인 사용법은 봤으니 다음 걸 설명한다.

 

LDR R0, [ R1, #1 ]          => R0 = R1[ 1 ]  => R1 + 1 과 같다.

LDR R0, [ R1, R2, LSL #2 ] => R0 = R1[ R2 * 4 ] 와 같다.

마찬가지로 STR을 보면

STR R0, [ R1, R2, LSL #2 ]  => R1[ R2 * 4 ] = R0 이다.

 

간단한 예시를 보자.

 

msg를 0x1234로 초기화 한뒤, ldr로 가져오는 코드다.

 

간단히 말해서,

r1은 r0[1] 이므로, 0x1234에서 0x12를 가져오고,

r2는 r0[2] 이지만, r0[2]은 0이어서 0을 가져온다.

배열이 이런 원리다.

 

만약, 한 바이트씩 아니라 다른 자료형의 크기만큼 가져오고 싶다면.

h는 short(2byte)

이렇게 해주면 된다.

그냥 ldr을 사용하면 0x34를 가져와야 하지만, short 크기만큼 가져오니, 0x1234를 가져온다.

 

 

 

Post-indexed Address

원래라면 r0에서 다음 값을 탐색하고 싶다면,

add r0, #1 이라는 코드를 하나 더 넣어야 하지만, ARM에선 그럴 필요가 없다.

 

LDR R0, [R1], #1 

=> R0 = *R1; R1+=1 이라 보면 된다. 참 간편하다. 무려 빼기도 된다.

 

이걸 어떻게 써먹는지 보자.

STR을 기준으로 설명한다. 원리는 둘 다 같으니깐

 

data 영역에 a, b, c를 집어넣는다.

 

 

값을 넣기 전 r0~r4 상태

 

 

실행을 하고 나면, msg의 위치(100b0)에 0x1111이 저장되고, r0의 값은 4 증가한 걸 볼 수 있다.

나머지 코드들을 실행한 결과다

 

숫자들이 연속되지 않은 이유가, .align에서 a, b, c를 word로 설정해서, 그런 거다.

short로 했으면 빈틈없이 들어간다.

 

 

!를 사용하기

위에 사용법에 { ! }가 있는데, 이거 역시 바로 위의 Post-indexed하고 같은 원리다.

다른 건 없고, 7, 8, 9 행의 상수를 중괄호 안에 넣고, 마지막에 !를 추가한게 끝이다.

'학교 > 시스템 프로그래밍' 카테고리의 다른 글

Signal  (0) 2020.12.05
PC, LR, SP  (0) 2020.11.17
section  (0) 2020.11.13
shift 연산자  (0) 2020.11.11
1. LDR/STR/ADR, 논리 연산  (0) 2020.11.10