Cpsc 318 Computer Structures Lecture 6 Assembly Programming Procedure Call Instructions - PowerPoint PPT Presentation

1 / 72
About This Presentation
Title:

Cpsc 318 Computer Structures Lecture 6 Assembly Programming Procedure Call Instructions

Description:

Registers play a major role in keeping track of information for function calls. ... wants to jump back to, but this will be overwritten by the call to mult. ... – PowerPoint PPT presentation

Number of Views:63
Avg rating:3.0/5.0
Slides: 73
Provided by: davepat4
Category:

less

Transcript and Presenter's Notes

Title: Cpsc 318 Computer Structures Lecture 6 Assembly Programming Procedure Call Instructions


1
Cpsc 318Computer Structures Lecture 6
Assembly ProgrammingProcedure Call Instructions
  • Dr. Son Vuong
  • (vuong_at_cs.ubc.ca)
  • January 20/25, 2005

2
Overview
  • Arithmetic and data transfer instructions
  • Branch instructions
  • Calling procedures
  • Register conventions
  • Logical, Shift, Load/Store (Bytes) Instr
  • Instruction representation

3
Overview
  • C Functions
  • MIPS Instructions for Procedures
  • The Stack
  • Register Conventions
  • Recursive procedure example
  • Shift, Load/Store Bytes Instructions

4
C functions
  • main() int i,j,k,m
  • i mult(j,k) ... m mult(i,i) ...
  • / really dumb mult function /
  • int mult (int mcand, int mlier)int product
  • product 0while (mlier gt 0) product
    product mcand mlier mlier -1 return
    product

What information mustcompiler/programmer keep
track of?
What instructions can accomplish this?
5
Function Call Bookkeeping
  • Registers play a major role in keeping track of
    information for function calls.
  • Register conventions
  • Return address ra
  • Arguments a0, a1, a2, a3
  • Return value v0, v1
  • Local variables s0, s1, , s7
  • The stack is also used.
  • More on this later.

6
Instruction Support for Functions (1/4)
C
  • ... sum(a,b)... / a,bs0,s1 /int sum(int
    x, int y) return xy
  • address1000 add a0,s0,zero x a1004
    add a1,s1,zero y b 1008 addi
    ra,zero,1016 ra10161012 j sum
    jump to sum1016 ...
  • 2000 sumadd v0,a0,a12004 jr ra new
    instruction

MIPS
7
Instruction Support for Functions (2/4)
  • Single instruction to jump and save return
    address jump and link (jal)
  • Before1008 addi ra,zero,1016 ra10161012
    j sum go to sum
  • After1012 jal sum ra1016,go to sum
  • Why have a jal? Make the common case fast
    functions are very common.

8
Instruction Support for Functions (3/4)
  • Syntax for jal (jump and link) is same as for j
    (jump)
  • jal label
  • jal should really be called laj for link and
    jump
  • Step 1 (link) Save address of next instruction
    into ra (Why next instruction? Why not current
    one?)
  • Step 2 (jump) Jump to the given label

9
Instruction Support for Functions (4/4)
  • Syntax for jr (jump register)
  • jr register
  • Instead of providing a label to jump to, the jr
    instruction provides a register which contains an
    address to jump to.
  • Only useful if we know exact address to jump to.
  • Very useful for function calls
  • jal stores return address in register (ra)
  • jr jumps back to that address

10
Nested Procedures (1/2)
  • int sumSquare(int x, int y) return mult(x,x)
    y
  • Something called sumSquare, now sumSquare is
    calling mult.
  • So theres a value in ra that sumSquare wants to
    jump back to, but this will be overwritten by the
    call to mult.
  • Need to save sumSquare return address before call
    to mult.

11
Nested Procedures (2/2)
  • In general, may need to save some other info in
    addition to ra.
  • When a C program is run, there are 3 important
    memory areas allocated
  • Static Variables declared once per program,
    cease to exist only after execution completes.
    E.g., C globals
  • Heap Variables declared dynamically
  • Stack Space to be used by procedure during
    execution this is where we can save register
    values

12
Calls Why Are Stacks So Great?
Stacking of Subroutine Calls Returns and
Environments
A
A CALL B CALL C
C RET
RET
B
A
B
A
B
C
A
B
A
Some machines provide a memory stack as part of
the architecture (e.g., VAX) Sometimes stacks
are implemented via software convention (e.g.,
MIPS)
13
C memory Allocation
Address

0
14
Stack frame
15
Using the Stack (1/2)
  • So we have a register sp which always points to
    the last used space in the stack.
  • To use stack, we decrement this pointer by the
    amount of space we need and then fill it with
    info.
  • So, how do we compile this?
  • int sumSquare(int x, int y) return mult(x,x)
    y

16
Using the Stack (2/2)
int sumSquare(int x, int y) return mult(x,x)
y
  • Hand-compile
  • sumSquare addi sp,sp,-8 space on
    stack sw ra, 4(sp) save ret addr sw
    a1, 0(sp) save y

push
add a1,a0,zero mult(x,x) jal mult
call mult
lw a1, 0(sp) restore y
add v0,v0,a1 mult()y lw
ra, 4(sp) get ret addr addi sp,sp,8
restore stack jr ra
mult ...
pop
17
Steps for Making a Procedure Call
  • 1) Save necessary values onto stack.
  • 2) Assign argument(s), if any.
  • 3) jal call
  • 4) Restore values from stack.

18
Rules for Procedures
  • Called with a jal instruction, returns with a
    jr ra
  • Accepts up to 4 arguments in a0, a1, a2 and
    a3
  • Return value is always in v0 (and if necessary
    in v1)
  • Must follow register conventions (even in
    functions that only you will call)! So what are
    they?

19
MIPS Registers
  • The constant 0 0 zeroReserved for
    Assembler 1 atReturn Values 2-3 v0-v1A
    rguments 4-7 a0-a3Temporary 8-15 t0-
    t7Saved 16-23 s0-s7More
    Temporary 24-25 t8-t9Used by
    Kernel 26-27 k0-k1Global Pointer 28 gpS
    tack Pointer 29 spFrame Pointer 30 fpR
    eturn Address 31 ra
  • (From COD 2nd Ed. p. A-23)Use names for
    registers -- code is clearer!

20
Register Conventions (1/5)
  • Caller the calling function
  • Callee the function being called
  • When callee returns from executing, the caller
    needs to know which registers may have changed
    and which are guaranteed to be unchanged.
  • Register Conventions A set of generally accepted
    rules as to which registers will be unchanged
    after a procedure call (jal) and which may be
    changed.

21
Register Conventions (2/5)
  • 0 No Change. Always 0.
  • s0-s7 No Change. Very important, thats why
    theyre called saved registers. If the callee
    changes these in any way, it must restore the
    original values before returning.
  • sp No Change. The stack pointer must
    point to the same place before and after the jal
    call, or else the caller wont be able to restore
    values from the stack.

22
Register Conventions (3/5)
  • ra Change. The jal call itself will change this
    register. Caller needs to save on stack if nested
    call.
  • v0-v1 Change. These are expected to contain
    the new returned values.
  • a0-a3 Change. These are volatile argument
    registers. Caller needs to save if theyll need
    them after the call.
  • t0-t9 Change. Thats why theyre called
    temporary any procedure may change them at any
    time. Caller needs to save if theyll need them
    afterwards.

23
Register Conventions (4/5)
  • What do these conventions mean?
  • If function R calls function E, then function R
    must save any temporary registers that it may be
    using onto the stack before making a jal call.
  • Function E must save any S (saved) registers it
    intends to use before garbling up their values
  • Remember Caller/callee need to save only
    temporary/saved registers they are using, not all
    registers.

24
Register Conventions (5/5)
  • Note that, if the callee is going to use some s
    registers, it must
  • save those s registers on the stack
  • use the registers
  • restore s registers from the stack
  • jr ra
  • With the temp registers, the callee doesnt need
    to save onto the stack.
  • Therefore the caller must save those temp
    registers that it would like to preserve though
    the call.

25
Other Registers
  • at may be used by the assembler at any time
    unsafe to use
  • k0-k1 may be used by the kernel at any time
    unsafe to use
  • gp dont worry about it
  • fp dont worry about it
  • Note Feel free to read up on gp and fp in
    Appendix A, but you can write perfectly good MIPS
    code without them.

26
Calls Why Are Stacks So Great?
Stacking of Subroutine Calls Returns and
Environments
A
A CALL B CALL C
C RET
RET
B
A
B
A
B
C
A
B
A
Some machines provide a memory stack as part of
the architecture (e.g., VAX) Sometimes stacks
are implemented via software convention (e.g.,
MIPS)
27
C memory Allocation
Address

0
28
Stack frame
29
And in Conclusion (1/2)
  • Functions are called with jal, and return with jr
    ra.
  • The stack is your friend Use it to save anything
    you need. Just be sure to leave it the way you
    found it.
  • Register Conventions Each register has a purpose
    and limits to its usage. Learn these and follow
    them, even if youre writing all the code
    yourself.

30
And in Conclusion (2/2)
  • Instructions we know so far
  • Arithmetic add,addi,addu,addiu,sub,subu
  • Memory lw, sw
  • Decision beq,bne, slt,slti,sltu,sltiu
  • Unconditional Branches (Jumps) j,jal,jr
  • Registers we know so far
  • All of them!

31
Review Basic Structure of a Function
  • entry_label addi sp,sp, -framesizesw ra,
    framesize-4(sp) save ra save other regs if
    need be
  • ...
  • restore other regs if need belw ra,
    framesize-4(sp) restore ra addi sp,sp,
    framesize jr ra

Prologue
ra
Body (call other functions)
Epilogue
memory
32
Example Compile This (1/5)
  • main() int i,j,k,m / i-ms0-s3 /
  • i mult(j,k) ... m mult(i,i) ...
  • int mult (int mcand, int mlier)int product
  • product 0while (mlier gt 0) product
    mcand mlier - 1 return product

33
Example Compile This (2/5)
  • start
  • add a0,s1,0 arg0 jadd a1,s2,0
    arg1 k jal mult call multadd
    s0,v0,0 i mult()...

add a0,s0,0 arg0 iadd a1,s0,0
arg1 i jal mult call multadd
s3,v0,0 m mult()...
done
34
Example Compile This (3/5)
  • Notes
  • main function ends with done, not jr ra, so
    theres no need to save ra onto stack
  • all variables used in main function are saved
    registers, so theres no need to save these onto
    stack

35
Example Compile This (4/5)
  • mult add t0,0,0 prod0

Loop slt t1,0,a1 mlr gt 0? beq
t1,0,Fin nogtFin add t0,t0,a0
prodmc addi a1,a1,-1 mlr-1 j
Loop goto Loop
Fin add v0,t0,0 v0prod jr
ra return
36
Example Compile This (5/5)
  • Notes
  • no jal calls are made from mult and we dont use
    any saved registers, so we dont need to save
    anything onto stack
  • temp registers are used for intermediate
    calculations (could have used s registers, but
    would have to save the callers on the stack.)
  • a1 is modified directly (instead of copying
    into a temp register) since we are free to change
    it
  • result is put into v0 before returning
  • What may still be missing?

37
Using the Stack (2/2) (recall slide 16)
int sumSquare(int x, int y) return mult(x,x)
y
  • Hand-compile
  • sumSquare addi sp,sp,-8 space on
    stack sw ra, 4(sp) save ret addr sw
    a1, 0(sp) save y

push
add a1,a0,zero mult(x,x) jal mult
call mult
lw a1, 0(sp) restore y
add v0,v0,a1 mult()y lw
ra, 4(sp) get ret addr addi sp,sp,8
restore stack jr ra
mult ...
pop
38
Example 2 Fibonacci s 1/8
  • The Fibonacci numbers are defined as follows
    F(n) F(n 1) F(n 2), F(0) and F(1) are
    defined to be 1
  • In scheme, this could be written
  • (define (Fib n) (cond (( n 0)
    1) (( n 1) 1) (else ( (Fib
    (- n 1)) (Fib (- n 2)))))

39
Example 2 Fibonacci s 2/8
  • Rewriting this in C we have
  • int fib(int n)
  • if(n 0) return 1
  • if(n 1) return 1
  • return (fib(n - 1) fib(n - 2))

40
Example 2 Fibonacci s 3/8
  • Now, lets translate this to MIPS!
  • You will need space for three words on the stack
  • The function will use one s register, s0
  • Write the Prologue

___________________ ___________________ _________
__________
fib ___________________ ___________________ _____
______________
  • addi sp, sp, -12
  • sw ra, 8(sp)
  • sw s0, 4(sp)
  • Space for three words
  • Save the return address
  • Save s0

41
Example 2 Fibonacci s 4/8
  • Now write the Epilogue

fin ___________________ ___________________ _____
______________ jr ra_____________
___________________ ___________________ _________
__________ ___________________
  • lw s0, 4(sp)
  • lw ra, 8(sp)
  • addi sp, sp, 12
  • Restore s0
  • Restore return address
  • Pop the stack frame
  • Return to caller

42
Example 2 Fibonacci s 5/8
  • Finally, write the body. The C code is below.
    Start by translating the lines indicated in the
    comments
  • int fib(int n)
    if(n 0)
    return 1 /Translate Me!/
    if(n 1) return 1 /Translate Me!/
    return (fib(n - 1) fib(n - 2))

beq a0 zero beq a0 t0
addi v0, zero, 1_ _______, _____,_fin addi t0,
zero, 1_ _______,______,_fin Contiued on next
slide. . .
  • v0 1
  • t0 1

___________________ __if (n 0). . . ______
____________ __if (n 1). . .
43
Example 2 Fibonacci s 6/8
  • Almost there, but be careful, this part is
    tricky!
  • int fib(int n) . .
    . return
    (fib(n - 1) fib(n - 2))

a0 0(sp) jal fib a0 0(sp)
a0, -1 Continued on next slide. . .
___________________ __Need a0 after jal _ fib(n
1) ______ __Restore a0______ __a0 n
2_________
  • a0 n - 1

addi a0, a0, -1__ sw____, ___________ __________
_________ lw____,____________ addi a0, ___,_____
44
Example 2 Fibonacci s 7/8
  • Remember that v0 is caller saved!
  • int fib(int n) . .
    . return
    (fib(n - 1) fib(n - 2))

add s0,____,______ ___________________ add
v0, v0, s0__ To the epilogue and beyond. . .
_______ v0 zero jal fib
  • Place fib(n 1)
  • somewhere it wont get
  • clobbered

____________________ ____________________ ________
____________ __fib(n 2) __________ __v0
fib(n-1) fib(n-2)
45
Example 2 Fibonacci s 8/8
  • Heres the complete code for reference
  • fib
  • addi sp, sp, -12
  • sw ra, 8(sp)
  • sw s0, 4(sp)
  • addi v0, zero, 1
  • beq a0, zero, fin
  • addi t0, zero, 1
  • beq a0, t0, fin
  • addi a0, a0, -1
  • sw a0, 0(sp)
  • jal fib

lw a0, 0(sp) addi a0, a0, -1 add s0, v0,
zero jal fib add v0, v0, s0 fin lw s0,
4(sp) lw ra, 8(sp) addi sp, sp, 12 jr ra
46
Overview
  • Logical Instructions
  • Shifts
  • Loading/Storing Bytes
  • Overflow in Arithmetic

47
Bitwise Operations (1/2)
  • Up until now, weve done arithmetic (add,
    sub,addi ), memory access (lw and sw), and
    branches and jumps.
  • All of these instructions view contents of
    register as a single quantity (such as a signed
    or unsigned integer)
  • New Perspective View contents of register as 32
    raw bits rather than as a single 32-bit number

48
Bitwise Operations (2/2)
  • Since registers are composed of 32 bits, we may
    want to access individual bits (or groups of
    bits) rather than the whole.
  • Introduce two new classes of instructions
  • Logical Operators
  • Shift Instructions

49
Logical Operators (1/4)
  • Two basic logical operators
  • AND outputs 1 only if both inputs are 1
  • OR outputs 1 if at least one input is 1
  • In general, can define them to accept gt2 inputs,
    but in the case of MIPS assembly, both of these
    accept exactly 2 inputs and produce 1 output
  • Again, rigid syntax, simpler hardware

50
Logical Operators (2/4)
  • Truth Table standard table listing all possible
    combinations of inputs and resultant output for
    each
  • Truth Table for AND and OR
  • A B A AND B A OR B
  • 0 0
  • 0 1
  • 1 0
  • 1 1

51
Logical Operators (3/4)
  • Logical Instruction Syntax
  • 1 2,3,4
  • where
  • 1) operation name
  • 2) register that will receive value
  • 3) first operand (register)
  • 4) second operand (register) or immediate
    (numerical constant)

52
Logical Operators (4/4)
  • Instruction Names
  • and, or Both of these expect the third argument
    to be a register
  • andi, ori Both of these expect the third
    argument to be an immediate
  • MIPS Logical Operators are all bitwise, meaning
    that bit 0 of the output is produced by the
    respective bit 0s of the inputs, bit 1 by the
    bit 1s, etc.

53
Uses for Logical Operators (1/3)
  • Note that anding a bit with 0 produces a 0 at the
    output while anding a bit with 1 produces the
    original bit.
  • This can be used to create a mask.
  • Example
  • 1011 0110 1010 0100 0011 1101 1001 1010
  • 0000 0000 0000 0000 0000 1111 1111 1111
  • The result of anding these
  • 0000 0000 0000 0000 0000 1101 1001 1010

mask
mask last 12 bits
54
Uses for Logical Operators (2/3)
  • The second bitstring in the example is called a
    mask. It is used to isolate the rightmost 12
    bits of the first bitstring by masking out the
    rest of the string (e.g. setting it to all 0s).
  • Thus, the and operator can be used to set certain
    portions of a bitstring to 0s, while leaving the
    rest alone.
  • In particular, if the first bitstring in the
    above example were in t0, then the following
    instruction would mask it
  • andi t0, t0, 0xFFF

55
Uses for Logical Operators (3/3)
  • Similarly, note that oring a bit with 1 produces
    a 1 at the output while oring a bit with 0
    produces the original bit.
  • This can be used to force certain bits of a
    string to 1s.
  • For example, if t0 contains 0x12345678, then
    after this instruction
  • ori t0, t0, 0xFFFF
  • t0 contains 0x1234FFFF (e.g. the high-order 16
    bits are untouched, while the low-order 16 bits
    are forced to 1s).

56
Shift Instructions (1/4)
  • Move (shift) all the bits in a word to the left
    or right by a number of bits.
  • Example shift right by 8 bits
  • 0001 0010 0011 0100 0101 0110 0111 1000
  • 0000 0000 0001 0010 0011 0100 0101 0110
  • Example shift left by 8 bits
  • 0001 0010 0011 0100 0101 0110 0111 1000

0011 0100 0101 0110 0111 1000 0000 0000
57
Shift Instructions (2/4)
  • Shift Instruction Syntax
  • 1 2,3,4
  • where
  • 1) operation name
  • 2) register that will receive value
  • 3) first operand (register)
  • 4) shift amount (constant lt 32)

58
Shift Instructions (3/4)
  • MIPS shift instructions
  • 1. sll (shift left logical) shifts left and
    fills emptied bits with 0s
  • 2. srl (shift right logical) shifts right and
    fills emptied bits with 0s
  • 3. sra (shift right arithmetic) shifts right and
    fills emptied bits by sign extending

59
Shift Instructions (4/4)
  • Example shift right arith by 8 bits
  • 0001 0010 0011 0100 0101 0110 0111 1000

0000 0000 0001 0010 0011 0100 0101 0110 Example
shift right arith by 8 bits 1001 0010 0011 0100
0101 0110 0111 1000
1111 1111 1001 0010 0011 0100 0101 0110
60
Uses for Shift Instructions (1/5)
  • Suppose we want to isolate byte 0 (rightmost 8
    bits) of a word in t0. Simply use
  • andi t0,t0,0xFF
  • Suppose we want to isolate byte 1 (bit 15 to
    bit 8) of a word in t0. We can use
  • andi t0,t0,0xFF00
  • but then we still need to shift to the right by
    8 bits...
  • andi t0,t0,8

61
Uses for Shift Instructions (2/5)
  • Could use instead
  • sll t0,t0,16 srl t0,t0,24
  • 0001 0010 0011 0100 0101 0110 0111 1000

0101 0110 0111 1000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0101 0110
62
Uses for Shift Instructions (3/5)
  • In decimal
  • Multiplying by 10 is same as shifting left by 1
  • 71410 x 1010 714010
  • 5610 x 1010 56010
  • Multiplying by 100 is same as shifting left by
    2
  • 71410 x 10010 7140010
  • 5610 x 10010 560010
  • Multiplying by 10n is same as shifting left by n

63
Uses for Shift Instructions (4/5)
  • In binary
  • Multiplying by 2 is same as shifting left by 1
  • 112 x 102 1102
  • 10102 x 102 101002
  • Multiplying by 4 is same as shifting left by 2
  • 112 x 1002 11002
  • 10102 x 1002 1010002
  • Multiplying by 2n is same as shifting left by n

64
Uses for Shift Instructions (5/5)
  • Since shifting may be faster than multiplication,
    a good compiler usually notices when C code
    multiplies by a power of 2 and compiles it to a
    shift instruction
  • a 8 (in C)
  • would compile to
  • sll s0,s0,3 (in MIPS)
  • Likewise, shift right to divide by powers of 2
  • remember to use sra

65
Loading, Storing bytes 1/3
  • In addition to word data transfers (lw, sw),
    MIPS has byte data transfers
  • load byte lb
  • store byte sb
  • same format as lw, sw

66
Loading, Storing bytes 2/3
  • What do with other 24 bits in the 32 bit
    register?
  • lb sign extends to fill upper 24 bits

xxxx xxxx xxxx xxxx xxxx xxxx
x
zzz zzzz
67
Loading, Storing bytes 3/3
  • Normally with characters don't want to sign
    extend
  • MIPS instruction that doesn't sign extend when
    loading bytes
  • load byte unsigned lbu

68
Overflow in Arithmetic (1/2)
  • Reminder Overflow occurs when there is a mistake
    in arithmetic due to the limited precision in
    computers.
  • Example (4-bit unsigned numbers)
  • 15 1111
  • 3 0011
  • 18 10010
  • But we dont have room for 5-bit solution, so
    the solution would be 0010, which is 2, and
    wrong.

69
Overflow in Arithmetic (2/2)
  • Some languages detect overflow (Ada), some dont
    (C)
  • MIPS solution is 2 kinds of arithmetic
    instructions to recognize 2 choices
  • add (add), add immediate (addi) and subtract
    (sub) cause overflow to be detected
  • add unsigned (addu), add immediate unsigned
    (addiu) and subtract unsigned (subu) do not cause
    overflow detection
  • Compiler selects appropriate arithmetic
  • MIPS C compilers produceaddu, addiu, subu

70
Unsigned Inequalities
  • Just as unsigned arithmetic instructions
  • addu, subu, addiu
  • (really "don't overflow" instructions)
  • there are unsigned inequality instructions
  • sltu, sltiu
  • which mean unsigned compare
  • 0x80000000 lt 0x7fffffff signed (slt, slti)
  • 0x80000000 gt 0x7fffffff unsigned (sltu,sltiu)

71
Things to Remember (1/2)
  • Logical and Shift Instructions
  • Operate on bits individually, unlike arithmetic,
    which operate on entire word.
  • Use to isolate fields, either by masking or by
    shifting back and forth.
  • Use shift left logical, sll,for multiplication
    by powers of 2
  • Use shift right arithmetic, sra,for division by
    powers of 2.
  • New Instructions and, andi, or, ori,
    sll, srl, sra

72
Things to Remember (2/2)
  • MIPS Signed v. Unsigned is an "overloaded" term
  • Do/Don't sign extend (lb, lbu)
  • Don't overflow (addu, addiu, subu, multu,
    divu)
  • Do signed/unsigned compare (slt, slti/sltu,
    sltiu)
Write a Comment
User Comments (0)
About PowerShow.com