Subroutines JSR JSRR - Computer & Information Science

Subroutines JSR JSRR - Computer & Information Science Subroutines JSR JSRR - Computer & Information Science

cis.upenn.edu
from cis.upenn.edu More from this publisher
01.08.2013 Views

What about User Code? Service routines provide three main functions 1. Protect system resources from malicious/clumsy programmers 2. Shield programmers from system-specific details 3. Write frequently-used code just once Do these benefits apply to application code, too? CSE 240 JSR JSR CSE 240 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 0 0 1 PCoffset11 R0 R1 R2 R3 R4 R5 R6 R7 Register File 0100000000011001 Just like JMP (but PC is saved in R7) Why not just use TRAP? PC 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1 BR 512 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 IR 16 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 1 ADD SEXT B 9 16 0000001000000000 A ALU 16 1 0 16 16 16 9-23 Note: This is PC of next instruction 9-25 Subroutines A subroutine is a program fragment that. . . • Resides in user space (i.e, not in OS) • Performs a well-defined task • Is invoked (called) by a user program • Returns control to the calling program when finished Like a service routine, but not part of the OS • Not concerned with protecting hardware resources • No special privilege required Virtues • Reuse useful code without having to keep typing it in (and debugging it!) • Divide task among multiple programmers • Use vendor-supplied library of useful routines CSE 240 JSRR JSRR Virtues of JSRR? CSE 240 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 0 0 0 0 0 BaseR 0 0 0 0 0 0 JSRR R5 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 IR Note: This is PC of next instruction R0 R1 R2 R3 R4 R5 R6 R7 Register File 000001000011000 0100010000011001 16 1 0 16 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 PC 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 1 this zero means “register mode” 16 16 9-24 9-26 1

What about User Code?<br />

Service routines provide three main functions<br />

1. Protect system resources from malicious/clumsy<br />

programmers<br />

2. Shield programmers from system-specific details<br />

3. Write frequently-used code just once<br />

Do these benefits apply to application code, too?<br />

CSE 240<br />

<strong>JSR</strong><br />

<strong>JSR</strong><br />

CSE 240<br />

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<br />

0 1 0 0 1 PCoffset11<br />

R0<br />

R1<br />

R2<br />

R3<br />

R4<br />

R5<br />

R6<br />

R7<br />

Register File<br />

0100000000011001<br />

Just like JMP (but PC is saved in R7)<br />

Why not just use TRAP?<br />

PC 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 1<br />

BR 512<br />

0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0<br />

IR<br />

16<br />

0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 1<br />

<br />

ADD<br />

SEXT<br />

B<br />

9<br />

16<br />

0000001000000000<br />

A<br />

ALU<br />

16<br />

1 0<br />

16<br />

16<br />

<br />

16<br />

9-23<br />

Note: This is PC<br />

of next<br />

instruction<br />

9-25<br />

<strong>Subroutines</strong><br />

A subroutine is a program fragment that. . .<br />

• Resides in user space (i.e, not in OS)<br />

• Performs a well-defined task<br />

• Is invoked (called) by a user program<br />

• Returns control to the calling program when finished<br />

Like a service routine, but not part of the OS<br />

• Not concerned with protecting hardware resources<br />

• No special privilege required<br />

Virtues<br />

• Reuse useful code without having to keep typing it in (and<br />

debugging it!)<br />

• Divide task among multiple programmers<br />

• Use vendor-supplied library of useful routines<br />

CSE 240<br />

<strong>JSR</strong>R<br />

<strong>JSR</strong>R<br />

Virtues of <strong>JSR</strong>R?<br />

CSE 240<br />

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0<br />

0 1 0 0 0 0 0 BaseR 0 0 0 0 0 0<br />

<strong>JSR</strong>R R5<br />

0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0<br />

IR<br />

Note: This is PC of<br />

next instruction<br />

R0<br />

R1<br />

R2<br />

R3<br />

R4<br />

R5<br />

R6<br />

R7<br />

Register File<br />

000001000011000<br />

0100010000011001<br />

16<br />

1 0<br />

16<br />

0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0<br />

PC 0 1 0 0 0 1 0 0 0 0 0 1 1 0 0 1<br />

this zero means “register mode”<br />

<br />

16<br />

16<br />

9-24<br />

9-26<br />

1


Returning From a Subroutine<br />

The RET instruction<br />

• Just a special case of JMP<br />

RET == JMP R7<br />

• Same idea as returning from TRAPs<br />

Note<br />

• If we use JMP to call subroutine, we can’t use RET!<br />

• Why not?<br />

CSE 240<br />

Passing <strong>Information</strong> To <strong>Subroutines</strong><br />

Argument(s)<br />

• Value passed in to a subroutine is called an argument<br />

• This is a value needed by the subroutine to do its job<br />

• Examples<br />

2sComp: R0 is number to be negated<br />

CSE 240<br />

OUT: R0 is character to be printed<br />

PUTS: R0 is address of string to be printed<br />

How?<br />

• In registers (simple, fast, but limited number)<br />

• In memory (many, but awkward, expensive)<br />

• Both<br />

9-27<br />

9-29<br />

Example: Negate the value in R0<br />

2sComp NOT R0, R0 ; flip bits<br />

ADD R0, R0, #1 ; add one<br />

RET ; return to caller<br />

To call from a program<br />

; need to compute R4 = R1 - R3<br />

ADD R0, R3, #0 ; copy R3 to R0<br />

<strong>JSR</strong> 2sComp ; negate<br />

ADD R4, R1, R0 ; add to R1<br />

...<br />

Note: Caller should save R0 if we’ll need it later!<br />

CSE 240<br />

Getting Values From <strong>Subroutines</strong><br />

Return Values<br />

• A value passed out of a subroutine is called a return value<br />

• This is the value that you called the subroutine to compute<br />

• Examples<br />

2sComp: negated value is returned in R0<br />

CSE 240<br />

GETC: character read from the keyboard is returned in R0<br />

How?<br />

• Registers, memory, or both<br />

• Single return value in register most common<br />

9-28<br />

9-30<br />

2


Calling Conventions<br />

Caller/Callee must agree on argument/ret-val location<br />

Approach 1<br />

• Every subroutine does what it likes<br />

• Program needs to look at documentation for each one<br />

Approach 2<br />

• Define a consistent calling convention<br />

LC-3<br />

• First 4 arguments passed in R0, R1, R2, R3<br />

• Subsequent arguments passed in memory (more on this later)<br />

• Single value returned in R5<br />

CSE 240<br />

Saving and Restore Registers<br />

Like service routines, must save and restore registers<br />

• Who saves what is part of the calling convention<br />

Generally use “callee-save” strategy, except for ret vals<br />

• Same as trap service routines<br />

• Save anything that subroutine alters internally that shouldn’t be<br />

visible when the subroutine returns<br />

• Restore incoming arguments to original values (unless<br />

overwritten by return value)<br />

Remember<br />

• You MUST save R7 if you call any other subroutine or trap<br />

• Otherwise, you won’t be able to return!<br />

CSE 240<br />

9-31<br />

9-33<br />

Using <strong>Subroutines</strong><br />

Programmer must know<br />

• Address: or at least a label that will be bound to its address<br />

• Function: what it does<br />

CSE 240<br />

NOTE: The programmer does not need to know how the<br />

subroutine works, but what changes are visible in the<br />

machine’s state after the routine has run<br />

• Arguments: what they are and where they are placed<br />

• Return values: what they are and where they are placed<br />

9-32<br />

3

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!