- 소량의 데이터만을 저장할 수 있는 레지스터에 비해 메모리는 수십억 개의 데이터 저장이 가능하다.
- 레지스터는 CPU 바로 옆에 위치해 있어 접근속도가 굉장이 빠름.
- 32bit의 경우 레지스터가 메모리보다 약 200배 빠르고, 에너지 효율도 10,000배 정도 높다.
- 상수연산은 자주 사용되는데 매번 메모리에서 상수를 가져와야하고, 수행되는 instruction 개수도 많다.
- 자주 사용되는 상수연산을 더 빠르고, 에너지를 적게 사용하기 위해 사용한다.
메모리가 있을 때, 어떤 순서로 메모리에 저장시킬 것인가.
- Big-endian
- Little-endian
큰 단위의 수(MSB)가 메모리의 최소주소에 저장된다.
ex) 0x123456
작은 단위의 수(LSB)가 메모리의 최소주소에 저장된다.
ex) 0x123456
1) a = b - 1;
2) a = b + 1024;
3) a = b + 4096; (x22 : a, x23 : b 할당되어있음.)
위의 C코드는 상수와 변수의 덧셈연산이므로 addi 연산을 사용하면 된다.
addi reg1, reg2, immediate # reg1 = reg2 + immediate
1) a = b + 1;
addi x22, x23, -1
2) a = b + 1024;
addi x22, x23, 1024;
3) a = b + 4096;
addi x22, x23, 4096 (X)
위와같이 하게되면 제대로 실행이 되지 않는다.
그 이유는 addi 명령어는 -2048 ~ 2047 사이의 상수값만 연산이 가능하기 때문이다. 그렇기 때문에 이 문제는 다른 방법으로 연산을 수행해야 한다.
addi x22, x0, 1 # a = 1;
slli x22, x22, 12 # a = a * 12; (4096 == 2*12)
addi x22, x23, x22 # a = b + 4096;
이 외에도 lui 연산을 사용해도 해결 가능하다.
아직은 코드를 짜면서 보이지 않았던 메모리를 공부하고 있다 보니 이해가 잘 되지 않고 많이 어려운 느낌이다. 이번 컴퓨터구조 과제를 해결할 때도 힘들었고, 구글링의 도움을 많이 받았다. 그래도 메모리가 어떻게 할당되는지, 연산들은 어떻게 이루어지는지 이해할때쯤 되면 컴퓨터에 대해 조금이라도 이해가 될 수 있을 것 같다.