5. 메모리 접근 (Addressing)
메모리 접근Addressing
지금까지 배운 MIPS 명령어들의 경우 5 비트의 레지스터 주소를 사용하는 경우가 일반적이었다. 그런데, MIPS 명령어에서 받을 수 있는 크기 (I 명령어의 경우, 16 비트)이상의 메모리 주소나 상수값이 입력되면 어떻게 할까?
이런 문제를 해결하기 위해 MIPS는 다양한 할당 방법을 제공한다.
직접 접근Immediate Addressing
I-구조 명령어는 16비트의 메모리 주소나 상수를 입력받는다. 이때, 입력할 상수값이 16비트보다 큰 경우, lui 명령어를 사용한다.
lui $s0, 61
위 명령어는 $s0의 앞 16비트에 61의 값을 담는다. 뒤쪽 16비트는 0으로 채워둔다.
이제 ori 명령어를 사용한다.
ori $s0, $s0, 2304
이제 $s0 뒤의 16비트에는 2304의 값이 채워졌다.
Psuedo-Direct Addressing
J-구조 명령어인 j(jump) 명령어는 opcode를 제외하고 26비트의 주소를 입력받는다. 이 역시 32비트의 메모리 주소보다 적은 값이다.
Psuedo-Direct 방법은 이를 해결하기 위한 방법이다. 이 방법은 현재 수행 중인 명령어들이 접근하는 메모리 위치가 근접하여, 현재 실행 중인 명령어와 이동하고자 하는 메모리 주소의 앞 4비트 주소가 같다고 가정한다.
먼저, 데이터는 항상 4비트 단위로 이동하므로, 26비트 address를 왼쪽으로 2칸 shift한다.(x4 하는 것과 같다.)
이제 모자란 4비트는 PC영역에 있는 현재 명령어의 주소 앞부분에서 4비트를 가져와 채운다.
PC-relative Addressing
beq, bne 명령어에서 사용되는 방법으로, 이동할 메모리의 주소가 멀지 않다는 가정하에 현재 PC와의 상대 거리를 address에 저장한다.
목표 address가 (PC + 4) + offset*4라고 정의하고, offset을 address에 저장한다.
물론 이때도 거리가 너무 멀면 예외가 발생하는데, 이 경우 컴파일러가 코드를 다음과 같이 수정한다.
beq $s0, $s1, L1 # L1이 너무 멀다면
#수정
bne $s0, $s1, L2
j L1 # jump 명령어를 대신 사용
L2: ...
Base Addressing
Base Addressing은 우리가 여러차례 썼던 방법이다. 마치 배열에 포인터로 접근하는 것과 같이, 기준 메모리 주소를 갖고 있는 레지스터와 해당 주소로부터의 변위를 이용하여 목표 주소에 도달한다.
lw $s1, 100($s5) # s5에서 100 떨어진 메모리 주소를 s1에 저장
'학부 수업 > 컴퓨터구조' 카테고리의 다른 글
6. 컴퓨터의 정수연산 (Integer Arithmetic of Computer) (0) | 2020.10.27 |
---|---|
5.5 프로그램의 실행 과정 (0) | 2020.10.12 |
4. MIPS의 명령어 구조와 명령어들 (0) | 2020.10.12 |
3. MIPS 아키텍처 (0) | 2020.10.12 |
2. 명령어와 CPU 아키텍처 (Instructions and CPU Architectures) (0) | 2020.10.12 |
댓글
이 글 공유하기
다른 글
-
6. 컴퓨터의 정수연산 (Integer Arithmetic of Computer)
6. 컴퓨터의 정수연산 (Integer Arithmetic of Computer)
2020.10.27 -
5.5 프로그램의 실행 과정
5.5 프로그램의 실행 과정
2020.10.12 -
4. MIPS의 명령어 구조와 명령어들
4. MIPS의 명령어 구조와 명령어들
2020.10.12 -
3. MIPS 아키텍처
3. MIPS 아키텍처
2020.10.12