Assembly Language

Chapter 14
Functions
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Function
Smaller, simpler, subcomponent of program
Provides abstraction
• hide low-level details
• give high-level structure to program,
easier to understand overall program flow
• enables separable, independent development
C functions
• zero or multiple arguments passed in
• single result returned (optional)
• return value is always a particular type
In other languages, called procedures, subroutines, ...
14-2
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example of High-Level Structure
main()
{
SetupBoard();
/* place pieces on board */
DetermineSides();
/* choose black/white */
/* Play game */
Structure of program
do {
is evident, even without
WhitesTurn();
knowing implementation.
BlacksTurn();
} while (NoOutcomeYet());
}
14-3
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Functions in C
Declaration (also called prototype)
int Factorial(int n);
type of
return value
name of
function
types of all
arguments
Function call -- used in expression
a = x + Factorial(f + g);
1. evaluate arguments
2, execute function
3. use return value in expression
14-4
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Function Definition
State type, name, types of arguments
• must match function declaration
• give name to each argument (doesn't have to match
declaration)
int Factorial(int n)
{
int i;
int result = 1;
for (i = 1; i <= n; i++)
result *= i;
return result;
}
gives control back to
calling function and
returns value
14-5
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Why Declaration?
Since function definition also includes
return and argument types, why is declaration needed?
• Use might be seen before definition.
Compiler needs to know return and arg types
and number of arguments.
• Definition might be in a different file, written by
a different programmer.
• include a "header" file with function declarations only
• compile separately, link together to make executable
14-6
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example
double ValueInDollars(double amount, double rate);
declaration
main()
{
function call (invocation)
...
dollars = ValueInDollars(francs,
DOLLARS_PER_FRANC);
printf("%f francs equals %f dollars.\n",
francs, dollars);
...
}
definition
double ValueInDollars(double amount, double rate)
{
return amount * rate;
}
14-7
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Implementing Functions: Overview
Activation record
• information about each function,
including arguments and local variables
• stored on run-time stack
Calling function
push new activation
record
copy values into
arguments
call function
get result from stack
Called function
execute code
put result in
activation record
pop activation record
from stack
return
14-8
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Run-Time Stack
Recall that local variables are stored
on the run-time stack
Stack pointer (R6) points to the beginning of a
region of memory that stores local variables for
the current function
That region of memory is called an activation record
When a new function is called,
its activation record is pushed on the stack;
when it returns
its activation record is popped off of the stack.
14-9
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Run-Time Stack
Memory
Memory
Memory
R6
main
R6
main
main
R6
NoName
Before call
During call
After call
Note: Using R6 this way is incompatible with
storing interrupt state on the stack.
14-10
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Activation Record
int NoName(int a, int b)
{
int w, x, y;
.
bookkeeping
.
.
return y;
}
locals
Name
a
b
w
x
y
Type
Offset
Scope
int
int
int
int
int
3
4
5
6
7
NoName
NoName
NoName
NoName
NoName
return value
return address
dynamic link
a
b
w
x
y
args
14-11
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Activation Record Bookkeeping
Return value
• always first word in activation record
• holds value returned by function
• allocated even if function does not return a value
Return address
• save pointer to next instruction in calling function
• convenient location to store R7 in case another function (JSR)
is called
Dynamic link
• address of previous activation record
• used to pop this activation record from stack
14-12
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Calling the Function
b = NoName(a, 10);
; store a to 1st argument
LDR R0, R6, #3
STR R0, R6, #8
; store 10 to 2nd argument
AND R0, R0, #0
ADD R0, R0, #10
STR R0, R6, #9
; store R6 into dynamic link
STR R6, R6, #7
; move R6 to start of new record
ADD R6, R6, #5
; call subroutine
JSR NoName
x4100
R6
Note: Caller needs to know number and type of arguments,
doesn't know about local variables.
x3F00
13
x4100
13
10
ret val
ret addr
dyn link
a
b
ret val
ret addr
dyn link
a
b
w
x
y
14-13
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Starting the Callee Function
; store return address
STR R7, R6, #1
x4100
x3F00
13
R6
x3100
x4100
13
10
ret val
ret addr
dyn link
a
b
ret val
ret addr
dyn link
a
b
w
x
y
14-14
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Ending the Callee Function
return y;
; copy y into return value
LDR R0, R6, #6
STR R0, R6, #0
; load the return address
LDR R7, R6, #1
; load the dynamic link
; (pops the activation record)
LDR R6, R6, #2
; return control to caller
RET
x4100
x3F00
13
R6
40
x3100
x4100
13
10
20
30
40
ret val
ret addr
dyn link
a
b
ret val
ret addr
dyn link
a
b
w
x
y
14-15
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Resuming the Caller Function
b = NoName(a,10);
; load return value
LDR R0, R6, #5
; store result into b
STR R0, R6, #4
x4100
R6
x3F00
13
40
40
ret val
ret addr
dyn link
a
b
ret val
14-16
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example
/* Function ToUpper:
* If the argument is lower case,
* return its upper case ASCII value */
char ToUpper(char inchar)
{
int outchar = inchar;
if ('a' <= inchar && inchar <= 'z')
outchar = inchar - ('a' - 'A');
return outchar;
}
Compile this function to LC-2 assembly language.
14-17
Copyright © The McGraw-Hill Companies, Inc. Permission required for reproduction or display.
Example: LC-2 Code for ToUpper
ToUpper
FALSE
STR
LDR
STR
LD
ADD
BRn
LD
ADD
BRp
LD
ADD
STR
LDR
STR
LDR
LDR
RET
R7, R6, #1 ; save return addr
R0, R6, #3 ; load parameter (inchar)
R0, R6, #4 ; initialize outchar
R1, neg_a ; load -'a'
R1, R0, R1 ; inchar - 'a'
FALSE
; br if inchar < 'a'
R1, neg_z ; load -'z'
R1, R0, R1 ; inchar - 'z'
FALSE
; br if inchar > 'z'
R1, neg_upper ; load -('a' - 'A')
R0, R0, R1
; inchar - ('a' - 'A')
R0, R6, #4 ; store to outchar
R0, R6, #4 ; load outchar
R0, R6, #0 ; store in result
R7, R6, #1 ; load return address
R6, R6, #2 ; load dynamic link
14-18