Instruction Set Architecture
An overview of MIPS R3000
assembly language
Fall 2004
SYCS-401 Operating Systems
Overview
Review of the concept of an Instruction
SetArchitecture (ISA)
Understand the format of MIPS
assembly source files
Be able to identify the registers of the
R3000 and their purpose
Be able to understand the effects of a
subset of instructions of the MIPS R3000
Instruction Set Architecture (ISA)
Fall 2004
SYCS-401 Operating Systems
Opcodes and Operands
add $a0, $t1, $t0
Operands
Opcode
(arguments)
(Instruction)
Fall 2004
SYCS-401 Operating Systems
Simple Assembler Program
.globlmain
.text
main:
#Programstartshere.
li$t0,5 #Loadtheintegervalue5
#intoregistert0
li$t1,19 #Load19intoregistert1
add$t2,$t1,$t0#Addregisterst0andt1
#toproducet2
li$v0,1 #Setupaprintintegercall
#toprinttheresult
move$a0,$t2
syscall
li$v0,10 #Setupanexitcall
syscall
#Dotheexitthing
Add the integers 5 and 19, and print the result. 8
Fall 2004
SYCS-401 Operating Systems
Instruction Set Architecture
(ISA)
Think of the ISA as the hardware/software
interface
In this lecture we look at some aspects of
MIPS ISA,
including:
Some opcodes
Required operands
Fall 2004
there are no implicit operands in MIPS
Means of accessing RAM
Number of registers
Instruction format
etc., etc.
SYCS-401 Operating Systems
MIPS: ISA generations (I to
IV)
MIPS I (8 MHz, 32b architecture)
MIPS II (40 MHz, 32b architecture)
R3000
MIPS III (to 250 MHz pipeline, 64b
architecture)
R2000 (first commercial MIPS processor)
R4x00
MIPS IV
Fall 2004
R8000
R10000
R5000
SYCS-401 Operating Systems
Fall 2004
SYCS-401 Operating Systems
MIPS Registers
Fall 2004
SYCS-401 Operating Systems
General-Purpose Registers
Fall 2004
SYCS-401 Operating Systems
General-Purpose Registers
Fall 2004
SYCS-401 Operating Systems
General-Purpose Registers
Fall 2004
SYCS-401 Operating Systems
General-Purpose Registers
Fall 2004
SYCS-401 Operating Systems
General-Purpose Registers
Fall 2004
SYCS-401 Operating Systems
General-Purpose Registers
Fall 2004
SYCS-401 Operating Systems
General-Purpose Registers
Fall 2004
SYCS-401 Operating Systems
General-Purpose Registers
Fall 2004
SYCS-401 Operating Systems
MIPS opcode formats
Fall 2004
SYCS-401 Operating Systems
MIPS Instruction
Categories
Arithmetic instructions
Logical instructions
Branch and jump instructions
add, subtract, multiply, divide comparison
conditional (branch)
unconditional (jump)
Data transfer (load & store)
instructions
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions
add
subtract
multiply
divide
compare
shift / rotate
not covered here
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions:
Add
Registers
ADD destinationReg, sourceReg, targetReg
Destination Source + Target
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions:
Add
Unsigned
ADDU destinationReg, sourceReg, targetReg
Destination Source + Target
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions:
Add
Immediate
ADDI destinationReg, sourceReg, targetReg
Destination Source + Target
Fall 2004
SYCS-401 Operating Systems
MIPS Opcode Map
Fall 2004
SYCS-401 Operating Systems
MIPS Opcode Map
Fall 2004
SYCS-401 Operating Systems
MIPS System Calls (syscall)
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions:
DivideDIVRegisters
sourceReg, targetReg
$lo (quotient), $hi (remainder) Source / Target
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions:
Multiply
Registers
MUL sourceReg, targetReg
$lo (low word), $hi (high word) Source x Target
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions:
Set
if Less Than
SLT destinationReg, sourceReg, targetReg
Destination Source < Target) ? 1 : 0
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions:
SLT
Immediate
SLTI destinationReg, sourceReg, immediate
Destination Source < immediate) ? 1 : 0
Fall 2004
SYCS-401 Operating Systems
Some other arithmetic
instructions
Fall 2004
SYCS-401 Operating Systems
Logical Instructions
Logical AND
logical OR
XOR
NOT
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions:
Logical
AND
AND destinationReg, sourceReg, targetReg
Destination Source AND Target
Fall 2004
SYCS-401 Operating Systems
Arithmetic Instructions:
Logical
OR
OR destinationReg, sourceReg, targetReg
Destination Source OR Target
Fall 2004
SYCS-401 Operating Systems
Some other Logical
instructions
Fall 2004
SYCS-401 Operating Systems
Branch and Jump
Instructions
These alter the (otherwise) linear flow of
control.
There are two main types of go to
instruction
unconditional ( always go to )
> jump
conditional ( if then go to )
> branch (indicating an alternative
flow)
Fall 2004
SYCS-401 Operating Systems
Branch and Jump
Instructions
Fall 2004
SYCS-401 Operating Systems
Jump Instructions: Jump
J label
Jump to instruction at label
Fall 2004
SYCS-401 Operating Systems
Jump Instructions: Jump &
Link
JAL label
Place the address of the next instruction (PC + 4) in $ra. Jump to the instruction at
label
Fall 2004
SYCS-401 Operating Systems
Jump Instructions: Jump &
Link
Fall 2004
SYCS-401 Operating Systems
Branch Instructions:
Branch on Equal
BEQ sourceRegister, targetRegister, label
If (sourceRegister == targetRegister)
go to instruction at label
Fall 2004
SYCS-401 Operating Systems
Branch Instructions:
Branch if Equal to Zero
BEQZ sourceRegister, label
If (sourceRegister == 0)
go to instruction at label
Fall 2004
SYCS-401 Operating Systems
Some other Jump/Branch
instructions
Fall 2004
SYCS-401 Operating Systems
Data transfer instructions
MIPS is a load-and-store architecture
The only instructions that access RAM are
those\
which load to (or store from) registers
Note that all other instructions operate on
registers
To change a value in memory, you must
therefore:
load it to a register
alter it
store it back in memory
Fall 2004
SYCS-401 Operating Systems
Data Transfer Instructions:
LoadLAAddress
destinationRegister, address
destinationRegister calculated address
Fall 2004
SYCS-401 Operating Systems
Data Transfer Instructions:
LoadLI Immediate
destinationRegister, immediate
destinationRegister immediate value
Fall 2004
SYCS-401 Operating Systems
Data Transfer Instructions:
Move from
HI
MFHI destinationRegister
destinationRegister HI register
Fall 2004
SYCS-401 Operating Systems
Data Transfer Instructions:
Load Byte
LB targetRegister, label
Load targetRegister with the byte value at address label
Fall 2004
SYCS-401 Operating Systems
Data Transfer Instructions:
StoreSBByte
targetRegister, label
Store low byte value in targetRegister at address label
Fall 2004
SYCS-401 Operating Systems
Data Transfer Instructions:
Load LW
Word
targetRegister, label
Load targetRegister with the word value at address label
Fall 2004
SYCS-401 Operating Systems
Data Transfer Instructions:
Move
MOVE destinationRegister, sourceRegister
destinationRegister sourceRegister
Fall 2004
SYCS-401 Operating Systems
Some other Data Transfer
instructions
Fall 2004
SYCS-401 Operating Systems
Assembler directives:
Examples
Fall 2004
SYCS-401 Operating Systems
Template.s
Fall 2004
SYCS-401 Operating Systems
Example.s
Fall 2004
SYCS-401 Operating Systems
Assembler Syntax
Comments
Identifiers
identifier { a-z A-Z _ . } { a-z A-Z _ . 0-9 }*
Label declaration (follow by a colon)
begin with a # and continue to the end of the
line
identifier:
Strings (use double quotes; special
characters use backslash)
\t \Hello World\ is \nthe usual example!
Fall 2004
SYCS-401 Operating Systems
High Level Language
Constructs
How do we code if-then, if-then-else,
while, do-while, for, and switch
statements.
Examples:
Assume The existence of a 32b integer
(labeled x) is assumed:
.data
x:
.word 0
Fall 2004
SYCS-401 Operating Systems
If Construct
Fall 2004
SYCS-401 Operating Systems
If Construct
Fall 2004
SYCS-401 Operating Systems
If Construct
Fall 2004
SYCS-401 Operating Systems
Post-Test Loop
Fall 2004
SYCS-401 Operating Systems
Post-Test Loop
Fall 2004
SYCS-401 Operating Systems
Simple Assembler Program
.globlmain
.text
main:
#Programstartshere.
li$t0,5
#Loadtheintegervalue5
#intoregistert0
li$t2,$a0
#sett2=0
bltz$t0,done
#ift0<=0thengotodone
start:
add$t2,$t2,$t0#Addregisterst0andt1
#toproducet2
subi$t0,t0,1 #t0=t01
jstart
done:
li$v0,1
#Setupaprintintegercall
#toprinttheresult
move$a0,$t2
syscall
Fall 2004
li$v0,10
#Setupanexitcall
syscall
#Dotheexitthing
SYCS-401 Operating Systems
Assembly vs. High-Level
Languages (HLLs)
Fall 2004
SYCS-401 Operating Systems
Producing an Executable
Fall 2004
SYCS-401 Operating Systems
Procedure Calls
The terminology tends to be rather
loose.
One view:
functions return values whereas
procedures do not
Here the terms are used
interchangeably
Fall 2004
SYCS-401 Operating Systems
Link Instructions
Link instructions leave a return
address on register $ra (31)
Unconditional (jump and link)
This is the address of the next
instruction, PC + 4.
jal
Conditional (branch and link)
b*al
Fall 2004
bgezal, bltzal, etc.
SYCS-401 Operating Systems
Returning from a
procedure
There is a jump register
instruction that jumps to the
address held in the specified
register
Typical use:
jr$ra
Note, however, that the specified
register does not need to be $ra
Fall 2004
SYCS-401 Operating Systems
Procedure Calls
Fall 2004
SYCS-401 Operating Systems
Passing function
arguments
Recall the register conventions that
MIPS uses
$a0 - $a3 are used for passing
arguments
Arguments must be simple
There is a limit of 4 by this convention
Greater demands than these are
met by use of the stack
Fall 2004
SYCS-401 Operating Systems
Returning values
Register conventions also specify
that registers $v0 - $v1 may be
used for returning values from a
function
Similar constraints apply to
argument-passing
Fall 2004
SYCS-401 Operating Systems
The Stack
Fall 2004
SYCS-401 Operating Systems
Uses of the stack
Save registers that are meant to
be preserved by the calling code.
Pass complex arguments to a
procedure
Use for local variables
Fall 2004
variables with local scope that are
destroyed once the procedure has
completed
SYCS-401 Operating Systems
Procedure Call
Conceptually
Fall 2004
SYCS-401 Operating Systems
Caller Template
(Calling the function)
Pass arguments to the function
first 4 arguments use registers $a0 $a3
more arguments must use the stack
Save any important values that are
held in temporary registers
Execute jump/branch and link
instruction
Fall 2004
SYCS-401 Operating Systems
Called template (Start)
Make room on the stack
Why subtraction?
Store any registers of interest
subi $sp, $sp, <bytes>
$ra if your routine makes a function
call
Why?
Fall 2004
Any $s0-$s7 registers that will be used
SYCS-401 Operating Systems
Called template (Finish)
Make returned values available
Restore any registers that were saved
$ra, $s0-$s7
Pop the stack
Put in $v0, $v1
addi $sp, $sp, <bytes>
Return
Fall 2004
jr $ra
SYCS-401 Operating Systems
Caller template (Returning
from
the
function)
Handle results, if any
registers $v0, $v1
Restore saved values, if any
Fall 2004
SYCS-401 Operating Systems
Sources
Indigo image and specs
http://www.sgi.com
For the R2000 instruction set
Patterson, D.A., & Hennesy, J.L., (1994).
ComputerOrganization and Design: The
Hardware / Software Interface, Morgan
Kaufmann. (Appendix A)
Available online at:
http://www.cs.wisc.edu/~larus/SPIM/codappa.pdf
Fall
For
the R3000 instruction
set
2004
SYCS-401 Operating Systems