기본 사용방법
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을 가져온다.
배열이 이런 원리다.
만약, 한 바이트씩 아니라 다른 자료형의 크기만큼 가져오고 싶다면.
이렇게 해주면 된다.
그냥 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를 집어넣는다.
실행을 하고 나면, 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 |