MIPS Data Transfer Instruction
MIPS 데이터 전송 명령어
- 데이터가 레지스터와 메모리를 오고 갈 수 있게 하는 명령어이다.
- MIPS Processor의 32개 레지스터는 \(2^5\) = 32bit로 구분(주솟값 할당)이 가능하다.
- 비교적 대용량의 메모리에는 레지스터의 주소 보다 큰 주소체계가 필요하다.
- Load : 메모리에서 레지스터로 데이터를 옮기는 연산이다.
- Store : 레지스터에서 메모리로 데이터를 저장시키는 연산이다.
- \(\texttt{lw}\)
- \(\texttt{lb, lbu}\)
- \(\texttt{lui}\)
- \(\texttt{sw}\)
- \(\texttt{sb}\)
\(\texttt{lw}\) Instruction (I-Format)
lw RD, Offset(RS) # RD ← RS + Offset
- "Load Word"라는 의미로, 데이터를 목적지로부터 1Word(4Byte) 단위로 불러오는 연산을 수행한다.
- \(\texttt{RD}\) : 목적지 레지스터 (불러온 데이터를 저장)
- \(\texttt{Offset}\) : 기준 주소로 부터의 차이 (불러올 데이터가 기준 주소로 부터 얼마나 떨어져 있는지에 대한 값, (데이터를 Word 단위로 불러오므로, 4의 배수이어야 한다.)
- \(\texttt{RS}\) : 기준 주솟값
Ex. \(\texttt{lw}\) 사용 예시
lw $t0, 32($s3) # $t0 ← [$s3 + 32]
\(\texttt{lb, lbu}\) Instruction (I-Format)
lb RD, Offset(RS)
lbu RD, Offset(RS)
- "Load Byte(unsigned)"라는 의미로, 데이터를 목적지로부터 1Byte 단위로 불러오는 연산을 수행한다.
- \(\texttt{RD}\) : 목적지 레지스터 (불러온 데이터를 저장)
- \(\texttt{Offset}\) : 기준 주소로 부터의 차이 (불러올 데이터가 기준 주소로 부터 얼마나 떨어져 있는지에 대한 값, 정수 범위)
- \(\texttt{RS}\) : 기준 주솟값
- \(\texttt{lb, lbu}\) 명령어의 경우 4Byte크기의 레지스터에 1Byte 크기의 데이터를 불러오게 되고, 부호의 유무에 따라 나머지 3Byte 잉여 공간에 대한 Sign-Extended 수행 여부를 결정한다.
- \(\texttt{lb}\) : 부호를 다루는 값에 대한 명령어이므로, Sign-Extended를 수행한다.
- \(\texttt{lbu}\) : 부호가 없는 값에 대한 명령어이므로, Sign-Extended를 수행하지 않는다.
(따라서, 부호를 다루지 않는 수치라면, \(\texttt{lbu}\) 명령어를 사용해야 한다.)
\(\texttt{lui}\) Instruction (I-Format)
- "Load Upper Immediate"라는 의미로, 추후 기재
\(\texttt{sw}\) Instruction (I-Format)
sw RS, Offset(RD) # RD + Offset ← RS
- "Store Word"라는 의미로, 데이터를 1Word(4Byte) 단위로 목적지에 저장하는 연산을 수행한다.
- \(\texttt{RS}\) : 메모리에 저장할 값을 담고있는 레지스터
- \(\texttt{Offset}\) : 기준 주소로 부터의 차이 (저장할 메모리 위치가 기준 주소로 부터 얼마나 떨어져 있는지에 대한 값, 4의 배수)
- \(\texttt{RD}\) : 기준 주솟값 (저장할 메모리의 기준 위치)
\(\texttt{sb}\) Instruction (I-Format)
sb RS, Offset(RD) # RD + Offset ← RS
- "Store Byte"라는 의미로, 데이터를 1Byte 단위로 목적지에 저장하는 연산을 수행한다.
- \(\texttt{RS}\) : 메모리에 저장할 값을 담고있는 레지스터
- \(\texttt{Offset}\) : 기준 주소로 부터의 차이 (저장할 메모리 위치가 기준 주소로 부터 얼마나 떨어져 있는지에 대한 값, 4의 배수)
- \(\texttt{RD}\) : 기준 주솟값 (저장할 메모리의 기준 위치)
- \(\text{sb}\) 명령어는 4Byte 크기의 레지스터에 저장된 데이터들 중, LSB(Least Significant Byte) 하나만 메모리에 저장하게 된다.
How to Load 32Bit Constant (32Bit 상수를 Load하는 방법)
1. \(\texttt{lw}\) 명령어를 통한 방법
- \(\texttt{lw}\)가 가리키는 레지스터에 32Bit 상수가 저장되어 있어야 하는 제약조건이 따른다.
2. \(\texttt{lui, ori}\) 명령어를 통한 방법
- OR 명령어를 Combine의 용도로 사용한 좋은 예시이다.
- \(\texttt{lui}\) 명령어로 인해 0x1234가 \(\texttt{\$t0}\)의 Upper Head에 저장된다.
- \(\texttt{ori}\) 명령어를 통해 0x5678과 Upper Head의 0x1234값이 결합된다.
이미지 출처 : 권건우 교수님 강의록