MIPS + MIPS Operations
MIPS 레지스터

MIPS의 레지스터는 $0~$31의 범용 레지스터 32개와 PC(Program Counter), LO/HI의 특수 레지스터로 구성된다.
- Program Counter는 다음에 수행할 기계어의 위치를 담고 있는 레지스터이며, Low, High 레지스터는 곱셈과 나눗셈의 결과를 저장하기 위한 레지스터이다.
- 32개의 범용 레지스터를 구분하기 위해 5비트(\(2^5=32\))가 필요하다.
비트(bit)
- binary digit
- 1비트로 2가지(0, 1)의 정보를 표현할 수 있음 -> N비트로 \(2^N\)가지 정보 표현 가능
바이트(byte)
- 1 byte = 8 bits
- 바이트는 1개의 영문자를 기억하는 최소 단위
워드(word)
- 컴퓨터 내부의 데이터 처리 및 전송의 단워
- 1 1word = 4 byte
MIPS 메모리

MIPS는 \(2^{32}\) 바이트(=4GB)의 메모리 주소 지정이 가능하다.
1KB = \(2^10\) bits
1MB = \(2^20\) bits
1GB = \(2^30\) bits
∴ \(2^{32}\) byte = \(2^{2\;+\;30} \) byte = \(2^2\times{2^{30}}\) byte = 4GB
MIPS에서는 메모리 구분을 위해 32비트를 지원하는데, 이 32비트로 \(2^{32}\)가지의 위치를 구분할 수 있고, 각각의 위치 주소는 바이트로 매겨지므로 \(2^{32}\) 바이트의 주소를 지정할 수 있는 것이다.
MIPS Register Naming
number | name | usage |
$0 | zero | constant 0 |
$1 | at | 어셈블러가 사용 |
$2, $3 | v0, v1 | 수식 계산 및 함수 결과값 저장 |
$4 ~ $7 | a0 ~ a3 | arguments |
$8 ~ $15 | t0 ~ t7 | temporary |
$16 ~ $23 | s0 ~ s7 | saved(preserved across a call) |
$24, $25 | t8, t9 | temporary |
$26, $27 | k0, k1 | OS가 사용함 |
$28 | gp | pointer for global area |
$29 | sp | stack pointer |
$30 | fp | frame pointer |
$31 | ra | return address |
- $0: 항상 0이 저장되어 있다.
- $4~7: 함수 인자 전달에 사용되는 레지스터이다. 함수 인자 전달 시 기본적으로 스택을 사용하지만, 인자 4개까지는 레지스터를 사용하여 전달할 수 있다.
- $8~15, $24, $25: 레지스터에 변수를 mapping할 때 사용하는 임시 레지스터이다. 함수가 호출되면 이들 임시 레지스터에 저장된 기존 데이터들이 호출된 함수(callee)에 의해 변형될 가능성이 있으므로, 함수 호출자(caller)는 자신의 데이터를 별도로 저장해 놓고 다른 함수를 호출해야 한다.
- $16~23: 임시 레지스터와는 다르게 함수가 호출되어도 덮어씌워지지 않고 항상 보존되는 값들이 저장된다.
MIPS Instructions
- Arithmetic/Logic instructions
- Data Transfer(Load/Store) instructions
- Conditional branch instructions
- Unconditional jumb instructions

- op: opcode
- rs: source register
- rt: source register(for R-type instruction)/ destination register(for I-type instruction)
- rd: destination register
- shamt: shift 연산에서 shift할 비트 수 저장
- funct: 구체적인 연산의 종류(add, sub, etc.)
위 표에서 opcode를 6비트로 나타내고 있는 것을 확인할 수 있는데, 그렇다고 해서 MIPS에 명령어가 \(2^6=64\)개만 존재하는 것은 아니다. 피연산자가 모두 레지스터인 경우, shamt와 funct 부분의 잉여 필드를 이용하여 추가적으로 연산을 표현할 수 있다.
Arithmetic Operations: 산술 연산


Logic Operations: 논리 연산

크기가 다른 수들 간 and operation을 수행할 때, 작은 수를 signed bit에 따라 큰 수의 크기가 될 때까지 확장(양수일 때 0, 음수일 때 1)하는 것이 일반적이다.
Data Transfer Instructions

- lw: 메모리에서 레지스터로 1 word(4바이트)씩 읽어 온다.
- sw: 레지스터에서 메모리로 1 word를 저장한다.
- lh(load halfword): 메모리에서 레지스터로 2바이트를 읽어 온다.
- lbu(load byte unsigned): 메모리에서 레지스터로 1바이트를 읽어 오되, 이들을 양수로 간주한다.
- lb(load byte): lbu와 동일하나 signed
- store byte: 레지스터에서 메모리로 1바이트를 저장한다.
※ MIPS Addressing
- 모든 메모리 접근은 Load/Store을 통해서만 가능하고, 이외에는 메모리에 접근하는 명령어가 존재하지 않는다.
- 메모리로부터 halfword 또는 1바이트를 load할 때, signed operation의 경우 sign-extended, unsigned operation의 경우 zero-extended 수를 사용한다.
- Alignment restriction: word address는 4의 배수, halfword address는 2의 배수여야 한다.
Conditional Jump Instructions

조건문 등에서 조건을 만족하면 branch하고, 조건을 만족하지 않으면 그대로 다음 기계어로 진행하는 등의 연산을 수행한다
- beq(branch on equal): 두 레지스터가 같으면 PC + imm만큼 branch한다.
- bne(branch on not equal): 두 레지스터가 다르면 PC + imm만큼 branch한다.
- slt(set on less than): $s2 < $3이면 $1을 참(1), 그렇지 않다면 $s1을 거짓(0)으로 set한다.
- slti(set less than immediate): $2 < imm이면 $1을 참(1), 그렇지 않다면 $s1을 거짓(0)으로 set한다.
- set on greater than, set on greater than equal 등도 존재한다.
※ 레지스터가 참인지(1) 거짓인지(0)인지 판단해야 할 때는 항상 상수 0이 저장돼 있는 $0을 사용한다.
→ beq $s1, $0, n
Unconditional Jump Instructions

조건 없이 Program Counter를 다른 위치로 바꾸어 jump한다.
- j(jump): target address로 jump한다. format이 j N일 때, target address = N*4이다.
- jr(jump register): $ra 레지스터 내의 주소로 jump
Opcode Structure

MIPS opaeration은 32bit로 제한되어 있으므로, 남아도는 공간이 있을 때 이들을 활용하여 추가 공간을 확보한다.
Base Addressing

lb $8, 4($9)는 $9 레지스터에 저장된 메모리 주소값($9 레지스터 x)에서 4바이트 떨어진 메모리 주소로부터 값을 load하여 레지스터에 저장
Register Addressing

레지스터를 3개 사용하는 operation의 경우, opcode를 전부 0으로 채우고 function field가 실제 operation을 결정
Immediate Addressing

Immediate는 instruction 자체에 직접 포함되는 상수 필드이다.
- Immediate는 다음 instruction부터 재사용 불가
※ 레지스터나 메모리에 값을 저장하면 다음 instruction에서 해당 값을 꺼내 쓰거나 읽을 수 있지만, 기계어 안에 피연산자가 들어 있는 immediate 같은 경우에는 그 다음 기계어 사용 시 해당 값을 다시 사용할 수 없다.
- 32비트의 용량 한계가 존재
- 추가 메모리 접근이 없으므로 빠른 연산 가능
Jump Instruction

immediate는 4의 배수이고, 4의 배수는 무조건 00으로 끝난다. 그러므로 target address가 4의 배수라는 것을 알고 있기 때문에 마지막 00을 떼 버려도(4로 나눠 주어도) 무방하며, 따라서 imm에 26비트가 할당되어 있지만 실제로는 28비트를 사용하는 것과 동일한 효과를 얻을 수 있다.
실제 target address는 instruction 상의 주소 값에 00을 붙인 값(4를 곱한 값)이다.
PC Relative Addressing

현재 위치(= PC, Program Counter)에서 offset만큼 떨어진 곳으로 branch하므로, address field에 PC value를 더하여 target address를 결정한다.
- 16비트의 제약이 있지만, program locality(인접성, 어느 정도 가까운 위치의 instruction이 수행되는 성질)이 존재하므로 대개 제한 범위를 벗어난 주소로 branch하지는 않는다.
※ branch가 일어나지 않는다면 Address 값은 자동으로 4씩 증가한다. (Address는 다음에 수행할 명령을 가리키므로)
Branch and Jump

branch
- op(6 bits), rs(5 bits), rd(5 bits), imm(16 bits)
- PC-relative하다(PC에서 offset만큼(=instruction 상 주소*4+4) 떨어진 위치로 이동하므로 PC에 상대적이다).
jump
- op(6 bits), address(26 bits)
- 특정 지점으로부터 offset만큼 떨어진 곳이 아닌, 절대적인 주소(instruction 상 주소*4)로 이동한다.