## A Minimalistic Introduction to MIPS Instruction

General Format

```               31     26    21    16    11    6      0
______ _____ _____ _____ _____ ______
|______|_____|_____|_____|_____|______|
OP     RS    RT    RD  SHAMT  FUNC
```
op rs rt rd shamt funct
6 bits 5 bits 5 bits 5 bits 5 bits 6 bits

op
Operation code

rs
First source register operand

rt
Second source register operand

rd
Destination register operand

shamt
Shift amount - used in shift instructions

funct
Select the variant of the operation in the op code field

Specific Instruction Formats

Format 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits Comments
R op rs rt rd shamt funct Arithmetic
I op rs rt address/immediate Transfer, branch,immediate

## MIPS Instruction Set

The MIPS instruction set illustrates four underlying principles of hardware design:

1. Simplicity favors regularity.
2. Smaller is faster.
3. Good design demands compromise.
4. Make the common case fast.
Simplicity favors regularity
Consider the following example:

Arithmetic subtract sub a,b,c a=b-c Always 3 operands

Note that each operand has exactly three operands.

Smaller is faster.
MIPS has 32 32-bit registers,\$v0,...\$v31, a very large number would increase the clock cycle time.

Good design demands compromise.
The compromise represented by the MIPS design, was to make all the instructions the same length, thereby requiring different instruction formats.

Make the common case fast.
The MIPS instruction set addresses this principal by making constants part of arithmetic instructions. Furthermore, by loading small constants into the upper 16-bits of a register.

## MIPS Instruction Set Summary

Arithmetic Instructions

subtract sub \$1,\$2,\$3 \$1=\$2-\$3 Always 3 operands
subtract unsigned subu \$1,\$2,\$3 \$1=\$2-\$3 Always 3 operations

Logical

and and \$1,\$2,\$3 \$1=\$2&\$3 3 register operands
or or \$1,\$2,\$3 \$1=\$2|\$3 3 register operands
and immediate andi \$1,\$2,10 \$1=\$2&10 AND constant
or immediate or \$1,\$2,10 \$1=\$2|10 OR constant
shift left logical sll \$1,\$2,10 \$1=\$2<<10 Shift left by constant
shift right logical srl \$1,\$2,10 \$1=\$2>>10 Shift right by constant

Data Transfer

load word lw \$1,10(\$2) \$1=Memory[\$2+10] memory to register
store word sw \$1,10(\$2) Memory[\$2+10]=\$1 register to memory
load upper immed. lui \$1,10 \$1=10x2^16 load constant into upper 16 bits

Conditional Branch

branch on equal beq \$1,\$2,10 if(\$1==\$2)go to PC+4+10 Equal test
branch on not equal bne \$1,\$2,10 if(\$1!=\$2)go to PC+4+10 Not equal test
set on less then slt \$1,\$2,\$3 if(\$2<\$3)\$1=1;else \$1=0 Less than compare

Unconditional Jump

jump register jr \$31 go to \$31 For switch, procedure return
jump and link jal 1000 \$31=PC+4;go to 1000 For procedure call

##### Assembler Syntax
• Program includes .data and .text
• Comments begin with #.  Rest of line is ignored.
• Identifier names are sequence of letters, numbers, underbars (_) and dots (.).
• Labels are declared by putting them at beginning of line followed by colon.  Use labels for variables and code locations.
• Instruction format: op field followed by one or more operands: addi \$t0, \$t0, 1
• Operands may be literal values or registers.
• Register is hardware primitive, can stored 32-bit value: \$s0
• Numbers are base 10 by default.  0x prefix indicates hexadecimal.
• Strings are enclosed in quotes.  May include \n=newline or \t=tab.  Used for prompts.
##### System Services in MIPS
To print an integer to the screen:
• Put the integer into \$a0
• Set \$v0 to 1
• syscall

To print a string to the screen:

• Put the address of the string into \$a0
• Set \$v0 to 4
• syscall

To read an integer from the keyboard

• Set \$v0 to 5
• syscall
• The integer entered will be in \$v0

To exit

• Set \$v0 to 10
• syscall