stacks and frames

Post on 12-Jan-2016

78 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Stacks and Frames. Memory Stacks Frames Automatic Variables. Memory. SPARC architecture has a 32 bit address register Provides 0x100,000,000 byte-addressable units of memory or 4,294,967,296 (2 32 ) bytes of memory (4 Gigabytes) Data may be stored in memory using Byte.byte1 byte - PowerPoint PPT Presentation

TRANSCRIPT

Stacks and Frames

MemoryStacksFrames

Automatic Variables

Memory

• SPARC architecture has a 32 bit address register• Provides 0x100,000,000 byte-addressable units of

memory or 4,294,967,296 (232) bytes of memory (4 Gigabytes)

• Data may be stored in memory using– Byte .byte 1 byte– Half-word .half 2 bytes– Word .word 4 bytes– Double .double 8 bytes

Memory alignment

• All memory references must be aligned• A byte can have any address• A half word must have an even address• A full word must have an address divisible by

4• A double word must have an address

divisible by 8

Program Address Space

Code SectionCode

Static variablesOS information

Heap SectionDynamic variables

Stack SectionAutomatic variables

High memoryHigh memory

Low memoryLow memory

Stack section

• Contains automatic variables of the functions• Contains frame information for each call of a

function• Stack grows from high memory to low

memory• Really a stack of Frames

Stack View

Stack Top %sp ->Stack Top %sp ->

High memoryHigh memory

Low memoryLow memory

Main FrameMain Frame

Function Frame 1Function Frame 1

Function Frame 2Function Frame 2

Function Frame 3Function Frame 3

Stack Addresses

• The stack is a stack of double words• Therefore, the stack pointer, register

%o6 or %sp, must always be divisible by 8

• This is accomplished by the save instruction

• save %sp, value & -8, %sp

The Frame (1)

Stack Top %sp ->Stack Top %sp ->

Frame Ptr %fp ->Frame Ptr %fp ->High memoryHigh memory

Low memoryLow memory

The Frame (2)

<- 64 bytes for <- 64 bytes for register window setregister window set

4 bytes for return 4 bytes for return structure address ->structure address ->

<- 24 bytes for first six <- 24 bytes for first six function parametersfunction parameters

Storage for Local Storage for Local variables ->variables ->

<- 16 bytes for <- 16 bytes for Compiler stuffCompiler stuff

Stack Top %sp ->Stack Top %sp ->

Frame Ptr %fp ->Frame Ptr %fp ->

The Frame Size

• Therefore the frame size is always(-108 - local_storage) & -8

• The minus sign is used because the stack grows from high memory to low memory

save %sp, (-108 - local_storage) & -8, %spnew sp = old_sp + (– 108 – local_storage) & -8new_fp = old_sp

Addressing Frame Components

• You never need to address the data in the register window set. The OS uses this

• The addresses of the return structure and parameters are referenced using the stack pointer, %sp

Those references are positive from the %sp

• The addresses of automatic variables, i.e. local variables use the frame pointer, %fp

Those references are negative from the %fp

Example

• Consider the C declarations:int x, y;char ch;double f;

• x and y take 4 bytes each• ch takes one byte• f takes 8 bytes• Storage starts at %fp -20

Example Frame

%fp-36%fp-36 chch

%fp-32%fp-32 ff

%fp-28%fp-28

%fp-24%fp-24 yy

%fp-20%fp-20 xx

%fp-16%fp-16

%fp-12%fp-12

%fp -8%fp -8

%fp-4%fp-4

%fp %fp

Addressing Local Variables(1)

• All automatic (local) variables are referenced using the frame pointer and their offsets (negative) from the frame pointer

• We define constants that represent their offsets• define ( x, -20)• define (y, -24)• define (ch, -36) // could use 35, 34, 33• define (f, -32)

Loading Local Variables(1)

• To load the variable x into %o0, we use the following instruction

ld [%fp + x], %o0

• To load the variable ch into %l0, we use the following instruction

ldub [%fp + ch], %l0

Loading Local Variables(2)

• To load the variable f into %o0 and %o1, we use the following instruction

ldd [%fp + f], %o0

Note: This instruction loads register %o0 with contents of f and register %o1 with contents f+4

Storing Local Variables(1)

• To store the variable x from %o0, we use the following instructionst %o0, [%fp + x]

• To store the variable ch from %l0, we use the following instructionstb %l0, [%fp + ch]

Storing Local Variables(2)

• To store the variable f from %o0 and %o1, we use the following instructionstd %o0, [%fp + f]

Note: This instruction stores register %o0 into f and register %o1 into f+4

Sample Program addxy.m

/*******************************************************

* File: addxy.m

* Dir: cis235/suns/ch05

* Date: February, 1999

* Modified: March 2001

* Author: HGG

* Computer: KUNET suns

* Assembler: sa addxy

* Compile: gcc

* Execute: a.out

* Purpose: To demonstrate local variables. Read

* two integers x and y, add them,

* put the result in sum and print

* everthing out.

*******************************************************/

addxy.m (1)

.data

.align 8prompt: .asciz "Enter two integers (^D to quit): "

. align 8formati:asciz "%d %d"

. align 8formato:.asciz "x = %d, y = %d, sum = %d\n"

.align 4 ! automatic data for a program

define(x, -20)define(y, -24)define(sum, -28)

addxy.m (2)

.text

.align 4

.global main

main: save %sp, (-108 - 12) & -8, %sp

 

loop: !while (printf(prompt),

sethi %hi(prompt), %o1

call printf,0

or %o1, %lo(prompt), %o0

addxy.m (3)

 ! scanf(formati, &x, &y) == 2)set formati, %o0 ! formati address in o0add %fp, x, %o1 ! address of x into o1call scanf,0add %fp, y, %o2 ! address of y into o2

cmp %o0, 2 ! 2 integers read? bne donenop

addxy.m (4)

NOTE how x and y are loadedfrom memory! sum = x + y;  ! o1 = x o2 = yld [%fp + x], %o1ld [%fp + y], %o2 add %o1, %o2, %o3 st %o3, [%fp + sum]! leave in o's for printf

addxy.m (4)

! printf(formato, x, y, sum)sethi %hi(formato),%l1call printf,0or %l1,%lo(formato),%o0b loopnop

 done: ! exit

callexit, 0mov 0, %o0

Exercise

• Modify your field extraction program so that the variables of integer, lsb, nob are local variables.

• Due date: Monday April 2

Array Storage

• Consider an array A in C defined as follows:

some_type A[array_size]

The compiler needs to set aside enough storage for the entire array. The following formula is used by the compiler:bytes_needed = array_size * size of some_type

Examples

Assume automatic storage is desired• int a[10] requires 40 bytes• double f[25] requires 200 bytes• char ch[25] usually requires 28 bytes (why?)• customertype customers[100] requires 8000

bytes assuming a customertype needs 80 bytes.

Array Addressing

• Once stored, how is the address of a component computed.

• Depends on how the elements are stored: big-endian little-endian

• Big-endian stores the low index in lower memory and the higher indices in high memory

• Little-endian stores the low index in high memory and the high indices in low memory

• Comes from the way numbers are stored

Big-endian vs Little-endianStoring 0x12345678

1212

3434

5656

7878

7878

5656

3434

1212

High memoryHigh memory

Low memoryLow memory

Big-EndianBig-Endian Little-EndianLittle-Endian

Big-endian vs Little-endian

A[0]A[0]

A[1]A[1]

A[size-1]A[size-1]

A[size-1]A[size-1]

A[1]A[1]

A[0]A[0] High memoryHigh memory

Low memoryLow memory

Big-EndianBig-Endian Little-EndianLittle-Endian

Big Endian Array Storage

• Most compiler store arrays in big endian order

• Address of a component A[I] is then computed using the following formula:address(A[i]) = address(A) +

i*(size of component)

Computing Address of A[i]

A[0]A[0]

A[1]A[1]

A[I]A[I]

A[size-1]A[size-1]

Address of AAddress of A

Address of A[I]Address of A[I]

i componentsi components

Size of 1 componentSize of 1 component

Example

• Suppose we have the following definitions in C:int sum;int A[10];int i;

• In assembler we could have the offsets:define(sum, -20)define(A, -60)define(i, -64)

Example (con’t)

The address of A[i] is given byaddress(A[i]) = address(A) + i * 4

Assembler code for the address:add %fp, A, %l0 ! Address of Ald [%fp + I], %l1 ! Value of isll %l1, 2, %l2 ! Multiply by 4add %l1, %l2, %l3 ! Address of A[i]

Looping Thru an Array

Consider the codesum = 0;

for(i = 0; i < 10; i++) sum = sum + A[i];

We use the computation of the address of A[i] to write the assembler code for the loop

Assembler Code for Loopclr %l0 ! sumclr %l1 ! i

loop: cmp %l1, 10bge donenopadd %fp, A, %o0 ! %o0 = addr(A)sll %l1, 2, %l2ld [%o0+ %l2], %o1 !%o1 = A[i]add %l0, %o1, %l0 !sum += A[i];inc %l1 ! i++b loopnop

done: st %l0, [%fp + sum]st %l1, [%fp + i]

Example

• Write an assembler program to read in an array of 10 integers and write them out.

arr.m (1)

.data .align 8prompt: .asciz "enter ten numbers: " .align 8frmti: .asciz "%d" .align 8frmto: .asciz "The value is %d\n"

arr.m (2)

define(i, -20) ! i - loop control variable define(A, -60) ! the array A .align 4 .text .global main

main: save %sp, (-108 - 44) & -8, %sp

arr.m (3)

! printf(prompt); sethi %hi(prompt), %o0 call printf, 0 or %o0, %lo(prompt), %o0

!***************************** ! for(i = 0;1 < 4; i++) ! scanf(frmti, &A[i]); mov 0, %l0 ! i = 0; st %l0, [%fp + i]

arr.m (4)

loop1: ! scanf(frmti, &A[i]) set frmti, %o0

add %fp, A, %o2 ! the address of A ld [%fp+i], %o1 sll %o1, 2, %o1 ! 4 * i add %o2, %o1, %o1 ! the addr( A[i] ) call scanf, 0 nop

arr.m (5)

! i++ ; i < 10? ld [%fp+i], %l0 inc %l0 st %l0, [%fp+i] cmp %l0, 10 bl loop1 nop

arr.m (6)

!**************************** ! for(i = 0;1 < 10; i++) ! printf(frmto, A[i]);

mov 0, %l0 ! i = 0; st %l0, [%fp + i]

arr.m (7)

loop2: ! printf(frmto, A[i]) != 1 set frmto, %o0 add %fp, A, %o2 ! the address of A ld [%fp+i], %o1 ! %o1 = i sll %o1, 2, %o1 ! %o1 = 4 * i add %o2, %o1, %o1 ! address of A[i] ld [%o1], %o1 ! contents of A[i] call printf, 0 nop

arr.m (8)

! i++ ; i < 10? ld [%fp+i], %l0 inc %l0 st %l0, [%fp+i] cmp %l0, 10 bl loop2 nop

arr.m (9)

call exit,0 mov 0, %o0

Structures

A structure is similar to a class, where all data members are public. In C structures do not have member functions.

The data members of a structure are stored as a composite unit. Each member has a address (offset) measured from the beginning of the structure

Example

Consider the customer structure defined below:

typedef struct { char name[24];

int age; int salary; } customer_type;

customer_type customer;

Addressing Structure Components

To address a component of a structure, we use the formula:addr(component) = addr(structure)

+ offset of component from beginning of

structureIt is customary to use Big Endian storage for structures, so the offset is positive.

customer

namename

ageage

salarysalary

CustomerCustomer

Offset of name: 0Offset of name: 0

Offset of age: 24Offset of age: 24

Offset of salary: 28Offset of salary: 28 High memoryHigh memory

Low memoryLow memory

customer.m(1)

/********************************************** File: customer.m* Dir: cis235/ch05* Date: January 2000* Author: HGG* Computer: KUNET suns* Assembler: sa compiles and executes* Purpose: To demonstrate the use of * structures in Assembly language**********************************************/

customer.m(2)

.dataprompt: .asciz "Enter the customer:\n"prompt_name: .asciz "Enter name: "prompt_age: .asciz "Enter age: "prompt_salary: .asciz "Enter salary: "fmt_name: .asciz "%s"fmt_age: .asciz "%d"fmt_salary: .asciz "%d"fmt_cust: .asciz "Customer: %s, %d, %d\n"

customer.m(3)

define(customer, 48) !frame address of customer define(name, 0) !offset of name within customer define(age, 24) !offset of age within customer define(salary, 28) !offset of salary within customer

customer.m(4)

.text .global mainmain: save %sp, (-108 - 32) & -8, %sp

! printf(prompt) set prompt, %o0 call printf nop

customer.m(5)

! printf(prompt_name); ! scanf(fmt_name, &customer.name); set prompt_name, %o0 call printf nop set fmt_name, %o0 add %fp, customer+name, %o1 call scanf nop

customer.m(6)

! printf(prompt_age); ! scanf(fmt_name, &customer.age); set prompt_age, %o0 call printf nop set fmt_age, %o0 add %fp, customer+age, %o1 call scanf nop

customer.m(7)

! printf(prompt_salary); ! scanf(fmt_salary, &customer.salary); set prompt_salary, %o0 call printf nop set fmt_salary, %o0 add %fp, customer+salary, %o1 call scanf nop

customer.m(8)

!printf(fmt_cust, customer.name, !customer.age. customer.salary);

set fmt_cust, %o0 add %fp, customer+name, %o1 ld [%fp + customer+age], %o2 ld [%fp + customer+salary], %o3 call printf nop done: call exit mov 0, %o0

Exercise

Write a program which will read in an array of five customers and print them out.

top related