3. Memory, addreses, Load and store
2장에서는 mov
명령어를 이용해 레지스터간 데이터를 이동하는 방법을 살펴보았다. 만약 프로세서가 이 기능만을 지원한다면 매우 제약적일것이다. 3장에서는 메모리에서 레지스터로 데이터를 주고 받는 방법에 대해 살펴본다.
Momory
Load and Store operations are the ways CPU could operate or access the memory
ldr
(load): register <----data---- memorystr
(store): register -----data---> memory
Addreses
메모리에 접근하기 위해서는 해당하는 이름이 필요하다. 하지만 모든 메모리 조각에 이름을 붙일 수 없다. 그래서 주소를 사용한다.
Data를 loading & store하기 위해서는 주소를 계산해야한다. 다양한 방식으로 주소가 계산 될 수 있는데, 이것을 Addressing Mode라고 한다. 괄호 []를 씌우면 []내에 있는 주소값에 저장된 값을 의미하게 된다. [r1] -> *r1 과 동일
byte 순서가 little-endian 임 유의
Data
label: is symbolic name to addresses in your program. 주소를 나타낸다.
.balign 4
myval1:
.word 3
.balign 4
다음 주소가 4바이트 단위로 시작할 것이라는것을 ensure하는 명령
이 지시자 다음 나오는 심볼은 한줄 한줄이 4byte offset을 갖는 다는 의미이다.
myval1: 이 변수의 주소를 정의
.word 3
4byte integer 데이터 타입임을 지시, 그리고 3으로 초기화
Sections
Data는 메모리에 상주 한다. .data라고 그 영역을 지정할 수 있다. .text는 코드 영역
load and store
/* -- store01.s */
.data /* -- Data section */
.balign 4 /* Ensure variable is 4-byte aligned */
myvar1: /* Define storage for myvar1 */
.word 0 /* Contents of myvar1 is just '3' */
.balign 4 /* Ensure variable is 4-byte aligned */
myvar2: /* Define storage for myvar2 */
.word 0 /* Contents of myvar2 is just '3' */
.text /* -- Code section */
.balign 4 /* Ensure variable is 4-byte aligned */
.global main
main:
ldr r1, addr_of_myvar1 /* r1 <- &myvar1 */
mov r3, #3 /* r3 <- 3 */
str r3, [r1] /* *r1 <- r3 */
ldr r2, addr_of_myvar2 /* r2 <- &myvar2 */
mov r3, #4 /* r3 <- 4 */
str r3, [r2] /* *r2 <- r3 */
ldr r1, addr_of_myvar1 /* r1 <- &myvar1 */
ldr r1, [r1] /* r1 <- *r1 */
ldr r2, addr_of_myvar2 /* r2 <- &myvar2 */
ldr r2, [r2] /* r2 <- *r2 */
add r0, r1, r2
bx lr
/* Labels needed to access data */
addr_of_myvar1 : .word myvar1
addr_of_myvar2 : .word myvar2
라인별 설명:
addr_of_myvar1 : .word myvar1
addr_of_myvar2 : .word myvar2
다른 section에 있는 심볼을 바로 access할 수 없다. 따라서 .data에 있는 myval 주소를 .text영역으로 가져온 것. ld가 relrocation 함.
ldr r1, addr_of_myval1 /* r1 <- &myvar1 */
ldr r1, [r1] /* r1 <- *r1 */
relocation된 myval1주소를를 r1에 넣은뒤,
myval1의 주소가 담겨있던 r1에 다시 myval1주소가 가지고 있던 값을 넣음.
[r1] <- []는 addressing mode임. 이것은 r1이 저장된 주소값을 의미한다.
ldr r1, addr_of_myvar1 /* r1 <- &myvar1 */
mov r3, #3 /* r3 <- 3 */
str r3, [r1] /* *r1 <- r3 */
relocation된 myval1주소를를 r1에 넣은뒤,
r3에 값3을 초기화.
myval1의 주소가 담겨있던 r1이 가리키는 값(주소)에 r3에 담겨있는 3을 store함.