Instructions 들은 binary로 인코딩 된다.
32-bit instruction words로 구성되며, instructions format이 R, I, J로 적은 편이다.
== Register numbers ==
$t0 ~ $t7은 8-15
$t8 ~ $t9는 24-25
$s0 ~ $s7은 16-23으로 각각 정해져있다.
MIPS 초록 종이에 다 나와 있음.
R-format은 op, rs, rt, rd, shamt, funct로 구성된다.
op : r-format임을 표시해주는 부분
rs rt : source register
rd : destination register이다.
shamt: shift 연산일 때 쓰이는데, 안 쓰이면 0이 들어간다.
funct : add, sub 등 실제 어떤 연산을 할 지 명시하는 부분
MIPS 레지스터는 총 32개이기 때문에, rs, rt, rd의 크기는 5bits 이다. (2^5)
* funct 코드도 green card에 있다.
I-format
op : I-format인 거 구분하기 위해서 있다.
I-format에서 rs, rt는 연산에 따라 다른 역할을 한다.
Ex) lw에서 rt는 destination, sw에서 rt 는 source
constant or address : 상수의 경우 -2^15 ~ 2^15 - 1까지, address는 rs에 더해질 offset이다. (16bits 임)
뒤에 i가 붙은 것들은 상수를 포함한 연산인데, 상수를 레지스터에 저장하지 않고 바로 계산할 수 있다.
보면 알겠지만 R-format과 그렇게 많이 다르지 않다.
Logical Operations
주의할 점은 logical shift right, left인 경우에는 shift 결과 후 앞 또는 뒤를 0으로 채워야 한다.
shift operation
shift 연산에서 rs는 쓰이지 않는다. 그치만 R-format임.
rt와 rd만 쓰이는데, rd를 shamt만큼 shift 연산한 값을 rt에 넣으라는 것이다.
shift right logic인 srl은 unsigned에서만 가능한데, signed에서는 또 다른 식으로 처리해야 한다. (Ch 3에 나옴)
** and, or 연산은 R-format
Ex ) and $t0, $t1, $t2 <- 이 경우 t1과 t2를 and 한 값을 t0에 저장하라는 뜻이다.
beq, bne, j
컴퓨터는 input 데이터에 따라 다른 행동을 하거나, 계산하는 동안 값을 생성할 수 있다.
-> branch를 사용하면 가능 (C를 예로 들면, if, else, else if, for, while, switch와 같은 것들)
beq rs, rt, L1
- rs와 rt가 같으면 L1으로 이동할 것
bne rs, rt, L1
slt, slti
- slt rd, rs, rt
- rs가 rt보다 작으면 rd는 1이고, rs가 rt보다 크면 rd는 0이다.
- slti rt, rs, constant
- rs가 상수보다 작으면 rt는 1, 크면 0
blt, bge가 없는 이유?
blt, bge는 beq, bne보다 속도가 느리다.
beq, bne와 slt, slti로 blt, bge를 구현 가능하다.
Procedure Calling
함수는 MIPS에서 어떻게 구현되는가?
- 함수 매개 변수를 register에 저장한다.
- control을 함수에 전달한다.
- 함수를 위한 stack 공간을 할당한다.
- 함수 실행
- caller를 위해 register에 값을 넣는다.
- 함수를 호출한 쪽으로 돌아간다.
PC : program counter로, 지금 진행하고 있는 instruction의 주소를 나타낸다. (special한 레지스터)
$ra : return address. 돌아가야 하는 부분의 주소를 저장하는 레지스터
jal, jr
jal ProcedureLabel
jump-and-link의 줄임말
- next instruction의 주소 (PC+4)를 $ra에 저장한다.
- target Address로 jump 한다.
jr $ra
jump-register의 줄임말
$ra를 PC에 옮겨 담는다.
$ra에 있던 주소로 되돌아 간다.
Register Usage and Stack
- More on MIPS registers$a0 - $a3 : arguments (4-7)$s0 - $s7 : 스택에 저장되는 값. $s0과 $s1를 callee에서 사용하면 이전에 있던 값이 사라지기 때문에 스택에 저장한 후, register를 사용하고 스택의 값을 복구하여 리턴한다. (즉, 이전의 값과 같다.)$sp : stack pointer (29)$ra : return address (31)
- $fp : frame pointer (30)
- $gp : global pointer for static data (28)
- $t0 - $t9 : temporaries (임시 변수) → 호출한 함수에서 동일한 레지스터에 값을 쓴다면 덮어씌워질 수 있다. (즉, 이전의 temp 값과 다를 수 있다.)
- $v0, $v1 : result values (2-3번)
- Stack
- LIFO 데이터 구조
- $sp는 가장 최근에 할당된 주소를 저장하는 register이다.
- stack은 위에서부터 값이 저장된다. (주소값이 높은 것에서부터 낮은 것으로)
- stack에 있는 값을 없애려면 addi $sp, $sp, 4를 하면 된다. (-4는 스택에 자리를 할당하는 것 - 스택은 아래로 자라나므로)
Memory Layout
- Text : 프로그램 코드
- Static data : 크기는 고정되어 있으며, global variable들이 저장되는 장소
- Dynamic data : heap. 실행 전에는 얼마나 할당될 지 모르며, 실행 후에 크기가 결정되는 데이터 구조. 크기는 정해져 있지 않다.
- Stack : 크기가 정해져 있지 않음. 자동으로 할당되는 공간인 듯.
!!! Stack과 Dynamic data가 만나면 어떻게 될까?
- 아무 일도 안 일어난다. → 놀랍게도 아무런 말도 해주지 않는다. 덮어씌워져도 개발자가 알 수가 없기 때문에 매우 주의해야 함.
- 충돌이 일어난다. (X)
lb, lbu, sb 는 수업에 언급된 적이 없으니 안 쓰겠다.
Branch Addressing
- beq, bne가 사용하는 format
- Opcode, 레지스터 2개, target Address 가 존재하므로 I-format이다.
- 대부분의 branch들은 근처의 branch를 가리키기 때문에, 주로 PC의 근처이다. → bne, beq는 비교적 가까운 주소로 이동하는 것이다.
- bne, beq는 PC와 상대적인 주소 처리이다.
- Target Address = PC + offset(16bits) * 4이다. (마찬가지로 instruction이 4bytes 이므로 4를 곱한다)
- branch는 -2^15 ~ 2^15까지의 instruction이 들어갈 수 있는데, MIPS의 instruction은 4bytes 이므로 총 +-2^17까지 저장할 수 있다.
- PC가 현재 이 위치에 있다는 것은 PC에 PC+4의 값이 들어가 있는 것이기 때문에, 실제 연산은 (PC + 4) + offset * 4이다.
Jump Addressing
- j, jal이 사용하는 format
- 조건 상관 없이 뒤에 오는 address 어디든지 이동할 수 있다.
- Direct jump addressing : Target address = address * 4이다.
- 2^26 words 내의 모든 주소를 이동할 수 있다. (words는 4bytes 이므로 2^28bytes의 주소들)
- jr은 R-format이다.
- OPcode, rs, funct만 존재하는 R-format
** 만약 beq를 사용해서 branch 처리를 했는데, target address가 너무 멀리 있는 경우에는 어셈블러가 자동으로 j-format으로 변경해준다.
Addressing Mode Summary
'School Lecture Study > Computer Architecture' 카테고리의 다른 글
Each instruction's datapath (0) | 2021.12.23 |
---|---|
Simple DataPath (0) | 2021.12.16 |
[5-2] Division (0) | 2021.10.21 |
[5-1] Overflow / Multiplication (0) | 2021.10.18 |
[3-3] Immediate Operands & Integer Wrapping & 보수 (0) | 2021.10.01 |