op : 명령어의 기본적인 연산자 (opcode)
rs, rt : 1번째, 2번째 송신지 피연산자 레지스터 (source operand)
rd : 목적지 피연산자 레지스터 (destination operand)
shamt : 쉬프트의 양 (몇 번 shift했는지, shift amount)
funct : op필드(연산자)에서 나타난 연산의 특정한 연산 종류를 지정 (function code)
add $t0, $s1, $s2 = add $8, $17, $18
Instruction | Format | op | rs | rt | rd | shamt | funct | 상수or주소 |
---|---|---|---|---|---|---|---|---|
add | R-type | 0 | reg | reg | reg | 0 | 32 | X |
sub | R-type | 0 | reg | reg | reg | 0 | 34 | X |
add immediate | I-type | 8 | reg | reg | X | X | X | 상수 |
lw (load word) | I-type | 35 | reg | reg | X | X | X | 주소 |
sw (store word) | I-type | 43 | reg | reg | X | X | X | 주소 |
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]
논리 연산자 | C 연산자 | Java 연산자 | MIPS 명령어 |
---|---|---|---|
Shift left | << | << | sll |
Shift right | >> | >>> | srl |
Bit-by-bit AND | & | & | and, andi |
Bit-by-bit OR | | | | | or, ori |
Bit-by-bit NOT | ~ | ~ | nor |
sllv(shift left logical variable)
srlv(shift right logical variable)
srav(shift right arithmetic variable)
rotr (rotate word right) ; funct = 000 010 (SRL)
rotrv (rotate word right variable) ; funct = 000 110 (SRLV)
if
~ go to
와 비슷하다.
beq register1, register2, L1
bne register1, register2, L1
ex) if (i==j) f=g+h; else f=g-h;
bne $s3,$s4,Else # go to {Else} if i≠j
add $s0,$s1,$s2 # f=g+h (skipped if i≠j)
j Exit # unconditional branch
Else: sub $s0,$s1,$s2 # f=g-h (skipped if i=j)
Exit:
slt $t0,$s3,$s4 # if($s3<$s4) then $t0=1
# else $t0=0
================================================================
slti $t0,$s2,10 # if $s2<10 $t0=1; else $t0=0
참고 : 의사코드
blt $s0, $s1, Less
: branch on less than하지만 MIPS architecture에서는 blt 명령어를 쓰지 않는다. 그 이유는 모든 비교가 slt, slti, beq, bne 그리고 $zero의 조합으로 가능한데, clock cycle time이 증가하기 때문 혹은 cpi가 늘기 때문에 굳이 blt라는 명령어를 쓰지않는다. 이걸 만들바에 차라리 slt같은것 하나 더 쓰는게 더 이득이다.
while (save[i]==k) i += 1;
Loop: sll $t1,$s3,2 # 임시레지스터$t1 = 4*i
add $t1,$t1,$s6 # $t1 = save[i]의 주소
lw $t0,0($t1) # Temp reg $t0 = save[i]
bne $t0,$s5,Exit # go to Exit if save[i]≠k
addi $s3,$s3,1 # i = i + 1
j Loop # go to Loop
Exit:
j Loop
jr $t0 # register($t0)내에있는 주소로 jump!
# i.e. PC ← $t0
jr $ra # 프로시저로부터 리턴, 보통 이 형식으로 사용한다.
PC는 Program Counter의 약자로 레지스터 $0~$31에 포함되지 않는 특수 레지스터이다. 이 레지스터는 현재 수행해야 하는 명령어의 주소값이 들어있다.
jal ProcedureAddress # $ra ← PC + 4, (단 $ra는 return address )
# PC ← Procedure address