0% found this document useful (0 votes)
567 views8 pages

Assembly MIPS Quick Tutorial

The document provides a quick tutorial on the MIPS architecture and assembly language. It describes the MIPS register set, data types, load/store instructions, arithmetic instructions, control structures, subroutine calls, and system calls. Key points include: MIPS uses 32 general purpose registers, data can be bytes, halfwords, or words, load/store instructions access memory, arithmetic uses three register operands, branches and jumps control flow, and system calls provide I/O functionality.

Uploaded by

Othon Oliveira
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
567 views8 pages

Assembly MIPS Quick Tutorial

The document provides a quick tutorial on the MIPS architecture and assembly language. It describes the MIPS register set, data types, load/store instructions, arithmetic instructions, control structures, subroutine calls, and system calls. Key points include: MIPS uses 32 general purpose registers, data can be bytes, halfwords, or words, load/store instructions access memory, arithmetic uses three register operands, branches and jumps control flow, and system calls provide I/O functionality.

Uploaded by

Othon Oliveira
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 8

11/09/2016

MIPS Quick Tutorial

MIPSArchitectureandAssemblyLanguageOverview
Adaptedfrom:http://edge.mcs.dre.g.el.edu/GICL/people/sevy/architecture/MIPSRef(SPIM).html

[RegisterDescription][I/ODescription]

DataTypesandLiterals
Datatypes:
Instructionsareall32bits
byte(8bits),halfword(2bytes),word(4bytes)
acharacterrequires1byteofstorage
anintegerrequires1word(4bytes)ofstorage
Literals:
numbersenteredasis.e.g.4
charactersenclosedinsinglequotes.e.g.'b'
stringsenclosedindoublequotes.e.g."Astring"

Registers
32generalpurposeregisters
registerprecededby$inassemblylanguageinstruction
twoformatsforaddressing:
usingregisternumbere.g.$0through$31
usingequivalentnamese.g.$t1,$sp
specialregistersLoandHiusedtostoreresultofmultiplicationanddivision
notdirectlyaddressablecontentsaccessedwithspecialinstructionmfhi("movefromHi")andmflo("movefromLo")
stackgrowsfromhighmemorytolowmemory
ThisisfromFigure9.9intheGoodman&Millertext
Register
Number
0
1
23
47

Alternative
Name
zero
$at
$v0$v1
$a0$a3

http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm

Description
thevalue0
(assemblertemporary)reservedbytheassembler
(values)fromexpressionevaluationandfunctionresults
(arguments)Firstfourparametersforsubroutine.
Notpreservedacrossprocedurecalls
1/8

11/09/2016

MIPS Quick Tutorial

815

$t0$t7

1623

$s0$s7

2425

$t8$t9

2627

$k0$k1

28

$gp

29

$sp

30

$s8/$fp

31

$ra

(temporaries)Callersavedifneeded.Subroutinescanusew/outsaving.

Notpreservedacrossprocedurecalls
(savedvalues)Calleesaved.
Asubroutineusingoneofthesemustsaveoriginalandrestoreitbeforeexiting.

Preservedacrossprocedurecalls
(temporaries)Callersavedifneeded.Subroutinescanusew/outsaving.
Theseareinadditionto$t0$t7above.

Notpreservedacrossprocedurecalls.
reservedforusebytheinterrupt/traphandler
globalpointer.
Pointstothemiddleofthe64Kblockofmemoryinthestaticdata
segment.
stackpointer
Pointstolastlocationonthestack.
savedvalue/framepointer
Preservedacrossprocedurecalls
returnaddress

SeealsoBrittonsection1.9,Sweetmansection2.21,LarusAppendixsectionA.6

ProgramStructure
justplaintextfilewithdatadeclarations,programcode(nameoffileshouldendinsuffix.stobeusedwithSPIMsimulator)
datadeclarationsectionfollowedbyprogramcodesection

DataDeclarations
placedinsectionofprogramidentifiedwithassemblerdirective.data
declaresvariablenamesusedinprogramstorageallocatedinmainmemory(RAM)

Code
placedinsectionoftextidentifiedwithassemblerdirective.text
containsprogramcode(instructions)
startingpointforcodee.g.ecutiongivenlabelmain:
endingpointofmaincodeshoulduseexitsystemcall(seebelowunderSystemCalls)

Comments
http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm

2/8

11/09/2016

MIPS Quick Tutorial

anythingfollowing#onaline
#Thisstuffwouldbeconsideredacomment
TemplateforaMIPSassemblylanguageprogram:
# Comment giving name of program and description of function
# Template.s
# Bare-bones outline of MIPS assembly language program
.data

# variable declarations follow this line


# ...

.text

# instructions follow this line

main:

# indicates start of code (first instruction to execute)


# ...

# End of program, leave a blank line afterwards to make SPIM happy

DataDeclarations
formatfordeclarations:
name:

storage_type

value(s)

createstorageforvariableofspecifiedtypewithgivennameandspecifiedvalue
value(s)usuallygivesinitialvalue(s)forstoragetype.space,givesnumberofspacestobeallocated
Note:labelsalwaysfollowedbycolon(:)
example
var1:
array1:

.word
.byte

3
# create a single integer variable with initial value 3
'a','b' # create a 2-element character array with elements initialized
# to a and b
.space 40
# allocate 40 consecutive bytes, with storage uninitialized
# could be used as a 40-element character array, or a
# 10-element integer array; a comment should indicate which!

array2:

Load/StoreInstructions
RAMaccessonlyallowedwithloadandstoreinstructions
allotherinstructionsuseregisteroperands
load:
lw

register_destination, RAM_source

http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm

3/8

11/09/2016

MIPS Quick Tutorial

#copyword(4bytes)atsourceRAMlocationtodestinationregister.
lb

register_destination, RAM_source

#copybyteatsourceRAMlocationtoloworderbyteofdestinationregister,
#andsigne.g.tendtohigherorderbytes
storeword:
sw

register_source, RAM_destination

#storewordinsourceregisterintoRAMdestination
sb

register_source, RAM_destination

#storebyte(loworder)insourceregisterintoRAMdestination
loadimmediate:
li

register_destination, value

#loadimmediatevalueintodestinationregister

example:
.data
var1: .word
.text
__start:
lw
li
sw
done

23

# declare storage for var1; initial value is 23

$t0, var1
$t1, 5
$t1, var1

# load contents of RAM location into register $t0: $t0 = var1


# $t1 = 5 ("load immediate")
# store contents of register $t1 into RAM: var1 = $t1

IndirectandBasedAddressing
Usedonlywithloadandstoreinstructions
loadaddress:
la

$t0, var1

copyRAMaddressofvar1(presumablyalabeldefinedintheprogram)intoregister$t0
http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm

4/8

11/09/2016

MIPS Quick Tutorial

indirectaddressing:
lw

$t2, ($t0)

loadwordatRAMaddresscontainedin$t0into$t2
sw

$t2, ($t0)

storewordinregister$t2intoRAMataddresscontainedin$t0
basedorindexedaddressing:
lw

$t2, 4($t0)

loadwordatRAMaddress($t0+4)intoregister$t2
"4"givesoffsetfromaddressinregister$t0
sw

$t2, -12($t0)

storewordinregister$t2intoRAMataddress($t012)
negativeoffsetsarefine
Note:basedaddressingisespeciallyusefulfor:
arraysaccesselementsasoffsetfrombaseaddress
stackseasytoaccesselementsatoffsetfromstackpointerorframepointer

example
array1:
__start:

.data
.space 12
.text
la
$t0, array1
li
$t1, 5
sw $t1, ($t0)
li $t1, 13
sw $t1, 4($t0)
li $t1, -7
sw $t1, 8($t0)
done

# declare 12 bytes of storage to hold array of 3 integers


#
#
#
#
#
#

# load base address of array into register $t0


$t1 = 5 ("load immediate")
first array element set to 5; indirect addressing
$t1 = 13
second array element set to 13
$t1 = -7
third array element set to -7

ArithmeticInstructions
mostuse3operands
alloperandsareregistersnoRAMorindirectaddressing
operandsizeisword(4bytes)
http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm

5/8

11/09/2016

MIPS Quick Tutorial

add
sub
addi
addu
subu

$t0,$t1,$t2
$t2,$t3,$t4
$t2,$t3, 5
$t1,$t6,$t7
$t1,$t6,$t7

#
#
#
#
#

$t0 = $t1 + $t2; add as signed (2's complement) integers


$t2 = $t3 $t4
$t2 = $t3 + 5; "add immediate" (no sub immediate)
$t1 = $t6 + $t7; add as unsigned integers
$t1 = $t6 + $t7; subtract as unsigned integers

mult

$t3,$t4

div

$t5,$t6

mfhi
mflo

$t0
$t1

#
#
#
#
#
#
#

multiply 32-bit quantities in $t3 and $t4, and store 64-bit


result in special registers Lo and Hi: (Hi,Lo) = $t3 * $t4
Lo = $t5 / $t6 (integer quotient)
Hi = $t5 mod $t6 (remainder)
move quantity in special register Hi to $t0: $t0 = Hi
move quantity in special register Lo to $t1: $t1 = Lo
used to get at result of product or quotient

move

$t2,$t3 # $t2 = $t3

ControlStructures
Branches
comparisonforconditionalbranchesisbuiltintoinstruction
b
beq
blt
ble
bgt
bge
bne

target
$t0,$t1,target
$t0,$t1,target
$t0,$t1,target
$t0,$t1,target
$t0,$t1,target
$t0,$t1,target

#
#
#
#
#
#
#

unconditional branch to program label target


branch to target if $t0 = $t1
branch to target if $t0 < $t1
branch to target if $t0 <= $t1
branch to target if $t0 > $t1
branch to target if $t0 >= $t1
branch to target if $t0 <> $t1

j
jr

target # unconditional jump to program label target


$t3
# jump to address contained in $t3 ("jump register")

Jumps

SubroutineCalls
subroutinecall:"jumpandlink"instruction
jal

sub_label

# "jump and link"

copyprogramcounter(returnaddress)toregister$ra(returnaddressregister)
jumptoprogramstatementatsub_label
subroutinereturn:"jumpregister"instruction
jr

$ra

# "jump register"

http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm

6/8

11/09/2016

MIPS Quick Tutorial

jumptoreturnaddressin$ra(storedbyjalinstruction)
Note:returnaddressstoredinregister$raifsubroutinewillcallothersubroutines,orisrecursive,returnaddressshouldbecopiedfrom$raontostacktopreserveit,since
jalalwaysplacesreturnaddressinthisregisterandhencewilloverwritepreviousvalue

SystemCallsandI/O(SPIMSimulator)
usedtoreadorprintvaluesorstringsfrominput/outputwindow,andindicateprogramend
usesyscalloperatingsystemroutinecall
firstsupplyappropriatevaluesinregisters$v0and$a0$a1
resultvalue(ifany)returnedinregister$v0
Thefollowingtableliststhepossiblesyscallservices.
Service
print_int

Code
Arguments
in$v0
1
$a0=integertobeprinted

print_float
print_double
print_string
read_int
read_float
read_double

2
3
4
5
6
7

read_string

sbrk
exit

9
10

Results

$f12=floattobeprinted
$f12=doubletobeprinted
$a0=addressofstringinmemory
integerreturnedin$v0
floatreturnedin$v0
doublereturnedin$v0
$a0=memoryaddressofstringinput
buffer
$a1=lengthofstringbuffer(n)
$a0=amount

addressin$v0

Theprint_stringserviceexpectstheaddresstostartanullterminatedcharacterstring.Thedirective.asciizcreatesanullterminatedcharacterstring.
Theread_int,read_floatandread_doubleservicesreadanentirelineofinputuptoandincludingthenewlinecharacter.
Theread_stringservicehasthesamesemanticesastheUNIXlibraryroutinefgets.
Itreadsupton1charactersintoabufferandterminatesthestringwithanullcharacter.
Iffewerthann1charactersareinthecurrentline,itreadsuptoandincludingthenewlineandterminatesthestringwithanullcharacter.
Thesbrkservicereturnstheaddresstoablockofmemorycontainingnadditionalbytes.Thiswouldbeusedfordynamicmemoryallocation.
Theexitservicestopsaprogramfromrunning.
e.g.

Print out integer value contained in register $t2


li

$v0, 1

http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm

# load appropriate system call code into register $v0;


# code for printing integer is 1
7/8

11/09/2016

MIPS Quick Tutorial

move
$a0, $t2
syscall
e.g.

# move integer to be printed into $a0: $a0 = $t2


# call operating system to perform operation

Read integer value, store in RAM location with label int_value (presumably declared in data section)
li

$v0, 5

# load appropriate system call code into register $v0;


# code for reading integer is 5
# call operating system to perform operation
# value read from keyboard returned in register $v0;
# store this in desired location

syscall
sw
$v0, int_value
e.g.

Print out string (useful for prompts)

string1

.data
.asciiz "Print this.\n"

main:

.text
li

# declaration for string variable,


# .asciiz directive makes string null terminated

$v0, 4

# load appropriate system call code into register $v0;


# code for printing string is 4
# load address of string to be printed into $a0
# call operating system to perform print operation

la
$a0, string1
syscall

e.g. To indicate end of program, use exit system call; thus last lines of program should be:
li
$v0, 10
syscall

# system call code for exit = 10


# call operating sys

http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm

8/8

You might also like