op | rs | rt | rd | shamt | funct |
---|---|---|---|---|---|
6 bits | 5 bits | 5 bits | 5 bits | 5 bits | 6 bits |
Example
add $t0, $s1, $s2
op | rs | rt | rd | shamt | funct |
---|---|---|---|---|---|
special | $s1 | $s2 | $t0 | 0 | add |
0 | 17 | 18 | 8 | 0 | 32 |
000000 | 10001 | 10010 | 01000 | 00000 | 100000 |
=> 0000 0010 0011 0010 0100 0000 0010 0000 (2)
=> 0 2 3 2 4 0 2 0 (16)
op | rs | rt | constant or address |
---|---|---|---|
6 bits | 5 bits | 5 bits | 16 bits |
I-type은 수치 연산과 데이터 전송 명령어에서 사용된다.
Immediate arithmetic and load/store instructions
- R-type과 I-type의 처음 세 필드는 이름과 크기가 같고, I 타입의 네 번째 필드 길이는 R 타입의 나머지 세 필드 길이를 더한 것과 같게 하였다.
- 명령어 형식은 첫 번째 필드의 값을 보고 구분한다. 형식별로 op 필드가 가질 수 있는 값들이 다르기 때문에, op 필드를 보고 R-type으로 할 지 I-type으로 할 지 결정한다.
Design Principle 4 : Good design demands good compromises
A[300] = h + A[300];
lw $t0, 1200($t1) # temporary reg $t0 gets A[300]
add $t0, $s2, $t0 # temporary reg $t0 gets h + A[300]
sw $t0, 1200($t1) # stores h + A[300] back into A[300]
op | rs | rt | rd | address/shamt | funct |
---|---|---|---|---|---|
35 | 9 | 8 | 1200 | ||
0 | 18 | 8 | 8 | 0 | 32 |
43 | 9 | 8 | 1200 |
연습문제 풀이가 좀 필요해 보인다.
Standardized ISAs?
Operation | C | Java | MIPS |
---|---|---|---|
Shift left | << | << | sll |
Shift right | >> | >>> | srl |
Bitwise AND | & | & | and, andi |
Bitwise OR | | | | | or, ori |
Bitwise NOT | ~ | ~ | nor |
op | rs | rt | rd | shamt | funct |
---|---|---|---|---|---|
6 bits | 5 bits | 5 bits | 5 bits | 5 bits | 6 bits |
shamt : How many positions to shift
Shift left
Shift right
Example
11 -> 110 -> 1100
3 -> 6 -> 12 (only for unsigned number)
Example (left shift 4)
원래 값은 $s0에 있고, 결과를 $t2 레지스터에 저장한다.
sll $t2, $s0, 4 #reg $t2 = reg $s0 << 4 bits
op(sll : 0) rs(사용x : 0) rt($s0 : 16) rd($t2 : 10) shamt(4) funct(0)
and $t0, $t1, $t2
or $t0, $t1, $t2
MIPS has NOR 3-operand instruction
a NOR b == NOT (a or b)
nor $t0, $t1, $zero
Register 0 : always read as zero
$t1과 0와 nor 연산한 결과를 $t0에 저장한다.
즉, $t1에 not 연산한 결과를 $t0에 저장한다.
Branch to a labeled instruction if a condition is true. Otherwise, continue sequentially.
브랜치 (branch)는 컴퓨터 프로그램에있어서, 컴퓨터에 의해 실행될 때, 컴퓨터로 하여금 다른 명령 시퀀스의 실행을 시작하게 할 수있는 명령이다.
"logical vs. conditional" -> "bitwise vs. conditional"
x & y // bitwise AND, 0101 & 0011 = 0001 x | y // bitwise OR, 0101 | 0011 = 0111 vs. x && y // true if both x and y are true x || y // true if either x or y are true
beq rs, rt, L1
: if (rs == rt) branch to instruction labeled L1;
: rs와 rt의 값이 같으면 L1에 대핟하는 문장으로 가라
beq = brach if equal
bne rs, rt, L1
: if (rs != rt) branch to instruction labeled L1;
: rs와 rt의 값이 같지 않으면 L1으로 가라
bne = branch if not equal
j L1
: unconditional jump to instruction labeled L1;
if (i == j) f = g + h;
else f = g - h;
// f, g, ... in $s0, $s1, ...
bne $s3, $s4, Else // s3!=s4 이면 Else로 넘어가
add $s0, $s1, $s2 // s0 = s1 + s2 (skipped if i!= j)
j Exit // go to Exit
Else : sub $s0, $s1, $s2 // s0 = s1 - s2 (skipped if i = j)
Exit : ...
while (save[i] == k)
i += 1;
// i in $s3, k in $s5, base address(시작 주소) of save in $s6(???)
Loop : sll $t1, $s3, 2 // temp reg $t1 = i * 4
add $t1, $t1, $s6 // $t1 = address of save[i]
lw $t0, 0($t1) // temp reg $t0 = save[i]
bne $t0, $s5, Exit // go to Exit if (k != save[i])
addi $s3, $s3, 1
j Loop // go to Loop
Exit : ...
A basic block is a sequence of instructions with no embedded branches (except at end) and no branch target(except at beginning)
basic block : Branch나 Return같은 제어 명령어로 끝남(다른 위치로 이동하지 않고 순서대로 실행되는 코드의 Block들을 의미)
$s0 = 1111 1111 1111 1111 1111 1111 1111 1111
$s1 = 0000 0000 0000 0000 0000 0000 0000 0001