• No se han encontrado resultados

Repeated Task (Different Data) - University of Victoria

N/A
N/A
Protected

Academic year: 2023

Share "Repeated Task (Different Data) - University of Victoria"

Copied!
26
0
0

Texto completo

(1)

Repeated Task (Different Data)

……

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

…………

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

…………

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

…………

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

……

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

…………

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

…………

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

…………

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

……

……

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

…………

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

…………

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

…………

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

(2)

Special Branch

…………

……

……

…………

……

…………

…………

……

…………

……

……

…………

……

……

CALL {parameters to SUBROUTINE}

RETURN (result to CALLER)

………..

LOOP LDR R3,[R2],#4 ADD R0,R0,R3 SUBS R1,R1,#1 BGT LOOP

………..

SUBROUTINE

Instructions

(3)

Fig. 2.16 Caller and Callee

Or Use Stack Frame

2

1 3

(4)

2.7.2 Parameter Passing

Parameter passing:

• Information exchange to/from a subroutine

• Different input => subroutine => different results

• Complete Solution: using stack for

• Parameters

• Local variables in subroutine

• Saving registers

• Return address

(5)

Fig. 2.20 Stack Frame Layout

(stack pointer)SP

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

A local base reference to access elements of current Stack Frame

A global reference point to push/pop stack

R0 and R1 are used by the current subroutine; original values of R0 and R1 must be saved before execution

Local variables for current subroutine

Parameter passing

(6)

Call Process (re: Fig. 2.20)

Caller:

1. Pass 4 parameters

a. Push 4 parameters Processor:

2. Call instruction executed

a. Return address on stack (↑SP) Subroutine:

3. FP is a GP register and saved on stack by

a. Move FP,-(SP) ; auto-decrement: R=R-WordSize first b. Move SP,FP ; ↑SP = ↑FP = old[FP]

4. Allocate local variables space a. Subtract #12,SP

5. Use R2, R1 so save on stack; ↑SP = old[R1]

(7)

Return Process (re: Fig. 2.20)

Subroutine:

6. Before Return:

a. Pop R0, R1

b. Add #12,SP; remove local variables c. Pop old[FP] back to FP

; ↑SP = return address

Processor:

7. Return instruction executed

Caller:

8. After Return:

a. Pop parameters; ↑SP = old TOS

(8)

Fig. 2.20 Stack Layout-Call-A

SP (stack pointer)

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

CC-0

CC=Caller Call

SC=Sub Call

(9)

Fig. 2.20 Stack Layout-Call-B

(stack pointer)SP

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

CC-1a

1. Pass 4 parameters

a. Push 4 parameters

CC=Caller Call SC=Sub Call

→ Stack Pointer

(10)

Fig. 2.20 Stack Layout-Call-C

(stack pointer)SP

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

CC-Call 2a

2. Call instruction executed

a. Return address on stack (↑SP)

CC=Caller Call

SC=Sub Call

(11)

Fig. 2.20 Stack Layout-Call-D

SP (stack pointer)

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

SC-3a

3. FP is a GP register and saved on stack by

a. Move FP,-(SP) ; auto- decrement

CC=Caller Call SC=Sub Call

→ Stack Pointer

(12)

Fig. 2.20 Stack Layout-Call-E

SP (stack pointer)

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

SC-3b SC-3b

3. FP is a GP register and saved on stack by (make FP=SP)

b. Move SP,FP ;

↑SP = ↑FP = old[FP]

CC=Caller Call

SC=Sub Call

(13)

Fig. 2.20 Stack Layout-Call-F

(stack pointer)SP

FP (frame pointer)

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

SC-4a

SC-3b

4. Allocate local variables space a. Subtract #12,SP

CC=Caller Call SC=Sub Call

→ Stack Pointer; → Frame Pointer

(14)

Fig. 2.20 Stack Layout-Call-G

(stack pointer)SP

FP (frame pointer)

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

SC-5

SC-3b

5. Use R1, R0 so save on stack;

↑SP = old[R1] = saved[R1]

CC=Caller Call

SC=Sub Call

(15)

Return Process (re: Fig. 2.20)

Subroutine:

6. Before Return:

a. Pop R0, R1

b. Add #12,SP; remove local variables c. Pop old[FP] back to FP

; ↑SP = return address

Processor:

7. Return instruction executed

Caller:

8. After Return:

a. Pop parameters; ↑SP = old TOS

(16)

Fig. 2.20 Stack Layout-Return-A

(stack pointer)SP

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

SR-6a

SC-3b

6. Before Return:

a. Pop R1, R0; original values

CR=Caller Return

SR=Sub Return

(17)

Fig. 2.20 Stack Layout-Return-B

SP (stack pointer)

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

SR-6b SC-3b 6. Before Return:

b. Add #12,SP; remove local variables

CR=Caller Return SR=Sub Return

→ Stack Pointer; → Frame Pointer

(18)

Fig. 2.20 Stack Layout-Return-C

(stack pointer)SP

FP (frame pointer)

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

SR-6c

6. Before Return:

c. Pop old[FP] back to FP ;

↑SP = return address

CR=Caller Return

SR=Sub Return

(19)

Fig. 2.20 Stack Layout-Return-D

(stack pointer)SP

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

7

7. Return instruction executed

CR=Caller Return SR=Sub Return

→ Stack Pointer

(20)

Fig. 2.20 Stack Layout-Return-E

(stack pointer)SP

(frame pointer)FP

saved [R1]

saved [R0]

Stack frame calledfor subroutine Return address

localvar3 localvar2 localvar1 saved [FP]

Old TOS param2

param1

param3 param4

(top-of-stack)

CR-8

8. After Return:

a. Pop parameters;

↑SP = old TOS

CR=Caller Return

SR=Sub Return

(21)

2.7.1 Subroutine Nesting

Subroutine nesting:

• A subroutine is allowed to call another subroutine

• Link register

• Has next address of first call

• Overwritten after subsequent calls

Subroutine #1 Subroutine #2

Link Register

Subroutine #3 1.1 Return Address.1

1.2 Call Sub #2

2.1 Return Address.2 2.2 Call Sub #3

Return.1 <= Return.2

Return.1

(22)

Subroutine Nesting using Stack

• Saves return address on stack before call

• Restores link register (pop from stack) after return from subroutine

Subroutine #1 Subroutine #2

Return.2

Subroutine #3 1.1 Ret Add

2.1 Ret Add

Return.1 XXXXXXX

1.2 2.2

Link Register Link Register Return from 3 Return from 2

STACK SP.1 —>

SP.2 —>

SP.3 —>

(23)

Example: Nested Subroutines Program

Main program .. .

2000 Move PARAM2, (SP) Place parameterson stack.

2004 Move PARAM1, (SP)

2008 Call SUB1

2012 Move (SP),RESULT Store result.

2016 Add #8,SP Restorestack level.

2020 next instruction .. .

(24)

Nested Subroutines Sub-1

2100 SUB1 Move FP, (SP) Save frame pointer register.

2104 Move SP,FP Load the frame pointer.

2108 MoveMultiple R0 R3, (SP) Save registers.

2112 Move 8(FP),R0 Get first parameter.

Move 12(FP),R1 Get secondparameter.

.. .

Move PARAM3, (SP) Placea parameteron stack.

2160 Call SUB2

2164 Move (SP)+,R2 Pop SUB2 result into R2.

.. .

Move R3,8(FP) Placeansweron stack.

MoveMultiple (SP)+,R0 R3 Restoreregisters.

Move (SP)+,FP Restoreframe pointer register.

Return Return to Main program.

– –

(25)

Nested Subroutines Sub-2

3000 SUB2 Move FP, (SP) Save frame pointer register.

Move SP,FP Load the frame pointer.

MoveMultiple R0 R1, (SP) Save registersR0 and R1.

Move 8(FP),R0 Get the parameter.

.. .

Move R1,8(FP) Place SUB2 result on stack.

MoveMultiple (SP)+,R0 R1 RestoreregistersR0 and R1.

Move (SP)+,FP Restoreframe pointer register.

Return Return to Subroutine 1.

– –

(26)

Nested Subroutines Stack Frames

FP

FP

[FP] from SUB1 2164

Stack frame firstfor subroutine [R0] from Main

param3 [R3] from Main [R2] from Main [R1] from Main

Old TOS 2012

[FP] from Main

param1 param2 [R0] from SUB1 [R1] from SUB1

Stack frame secondfor subroutine

Assignment: indicate where the

SP is pointing to after the execution

of each instruction

Referencias

Documento similar

Se concluye que La Vigía es de los primeros asentamientos del siglo XIX , y el primero del siglo XX , en el que se aplican las Ordenanzas de Felipe II en la ciudad; además es