# Chapter2.
## Instructions: Language of the Computer
## MIPS Instruction Set
| Category | instruction | abbr. | Example | Meaning | Comment |
|:----------------------:|:-------------------------------- |:-----:|:------------------ |:-------------------------------- |:------------------------------------- |
| **Arithmetic** | add | add | add\$s1,\$s2,\$s3 | \$s1 = \$s2 + \$s3 | Three register operands |
| | subtract | sub | sub\$s1,\$s2,\$s3 | \$s1 = \$s2 - \$s3 | Three register operands |
| | add immediate | addi | addi\$s1,\$s2,20 | \$s1 = \$s2 + 20 | Used to add constants |
| **Data transfer** | load word | lw | lw\$s1,20(\$s2) | \$s1 = Memory[\$s2+20] | Word from memory to register |
| | store word | sw | sw\$s1,20(\$s2) | Memory[\$s2+20] = \$s1 | Word form register to memory |
| | load half | lh | lh\$s1,20(\$s2) | \$s1 = Memory[\$s2+20] | Halfword memory to register |
| | load half unsigned | lhu | lhu\$s1,20(\$s2) | \$s1 = Memory[\$s2+20] | Halfword memory to register |
| | store half | sh | sh\$s1,20(\$s2) | Memory[\$s2+20] = \$s1 | Halfword register to memory |
| | load byte | lb | lb\$s1,20(\$s2) | \$s1 = Memory[\$s2+20] | Bytes from memory to register |
| | load byte unsigned | lbu | lbu\$s1,20(\$s2) | \$s1 = Memory[\$s2+20] | Bytes from memory to register |
| | store byte | sb | sb\$s1,20(\$s2) | Memory[\$s2+20] = \$s1 | Bytes from register to memory |
| | load linked word | ll | ll\$s1,20(\$s2) | \$s1 = Memory[\$s2+20] | Load word as 1st half of atomic swap |
| | store condition word | sc | sc\$s1,20(\$s2) | Memory[\$s2+20] = \$s1:\$s1=0or1 | Store word as 2nd half of atomic swap |
| | load upper immed | lui | lui\$s1,20 | \$s1 = 20 * 2^16 | Loads constant in upper 16 bits |
| **Logical** | and | and | and\$s1,\$s2,\$s3 | \$s1 = \$s2 & \$s3 | Three reg. operands; bit-by-bit AND |
| | or | or | or\$s1,\$s2,\$s3 | \$s1 = \$s2 \| \$s3 | Three reg. operands; bit-by-bit OR |
| | nor | nor | nor\$s1,\$s2,\$s3 | \$s1 = ~(\$s2\|\$s3) | Three reg. operands; bit-by-bit NOR |
| | and immediate | andi | addi\$s1,\$s2,20 | \$s1 = \$s2 & 20 | Bit-by-bit AND reg with constant |
| | or immediate | ori | ori\$s1,\$s2,20 | \$s1 = \$s2 \| 20 | Bit-by-bit OR reg with constant |
| | shift left logical | sll | sll\$s1,\$s2,10 | \$s1 = \$s2 << 10 | Shift left by constant |
| | shift right logical | srl | srl\$s1,\$s2,10 | \$s1 = \$s2 >> 10 | Shift right by constant |
| **Conditional branch** | branch on equal | beq | beq\$s1,\$s2,25 | if(\$s1==\$s2) go to PC+4+100 | Equal test; PC-relative branch |
| | branch on not equal | bne | beq\$s1,\$s2,25 | if(\$s1!=\$s2) go to PC+4+100 | Not equal test; PC-relative |
| | set on less than | slt | slt\$s1,\$s2,\$s3 | if(\$s2<\$s3) \$s1=1;else \$s1=0 | Compare less than; for beq, bne |
| | set on less than unsigned | sltu | sltu\$s1,\$s2,\$s3 | if(\$s2<\$s3) \$s1=1;else \$s1=0 | Compare less than unsigned |
| | set less than immediate | slti | slti\$s1,\$s2,20 | if(\$s2<20) \$s1=1;else \$s1=0 | Compare less than constant |
| | set less than immediate unsigned | sltiu | sltiu\$s1,\$s2,20 | if(\$s2<20) \$s1=1;else \$s1=0 | Compare less than unsigned |
| **Unconditional jump** | jump | j | j2500 | go to 10000 | Jump to target address |
| | jump register | jr | jr$ra | go to $ra | For switch, procedure return |
| | jump and link | jal | jal2500 | $ra = PC+4:go to 10000 | FOr procedure call |
---
## MIPS Register number
| Name | Register number | Usage | Preserved on call? |
|:-------- |:---------------:|:-------------------------------------------- |:------------------------------------:|
| \$zero | 0 | The constant value 0 | n.a. |
| \$v0-$v1 | 2-3 | Values for results and expression evaluation | no |
| \$a0-$a3 | 4-7 | Arguments | no |
| \$t0-$t7 | 8-15 | Temporaries | no |
| \$s0-$s7 | 16-23 | Saved | <font color="crimson">**yes**</font> |
| \$t8-$t9 | 24-25 | More temporaries | no |
| \$gp | 28 | Global pointer | <font color="crimson">**yes**</font> |
| \$sp | 29 | Stack pointer | <font color="crimson">**yes**</font> |
| \$fp | 30 | Frame pointer | <font color="crimson">**yes**</font> |
| \$ra | 31 | Return pointer | <font color="crimson">**yes**</font> |
---
## MIPS R-format Instructions: (R-->Register)
| op | rs | rt | rd | shamt | funct |
|:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
| 6bits | 5bits | 5bits | 5bits | 5bits | 6bits |
Ex:Translate <font color="red">add $t0, $s1, $s2</font> to machine instruction
### Instruction field:
- op: operation code(opcode)
- rs: first source register number<font color="red">(\$s1)</font>
- rt: second source register number<font color="red">(\$s2)</font>
- rd: destination register number<font color="red">(\$t0)</font>
- shmat: shift amount(00000 for now) (ex:sll, srl)
- funct: function code(extend opcode)
---