1 / 17

Computer Science 210 Computer Organization

Computer Science 210 Computer Organization. Introduction to Subroutines. Subroutines. A subroutine is a program fragment that: lives in user space performs a well-defined task is invoked (called) by another user program returns control to the calling program when finished. Subroutines.

osman
Download Presentation

Computer Science 210 Computer Organization

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Computer Science 210Computer Organization Introduction to Subroutines

  2. Subroutines • A subroutine is a program fragment that: • lives in user space • performs a well-defined task • is invoked (called) by another user program • returns control to the calling program when finished

  3. Subroutines • Like a service routine, but not part of the OS • not concerned with protecting hardware resources • no special privilege required • Reasons for subroutines: • reuse useful (and debugged!) code without having tokeep typing it in • divide task among multiple programmers • use vendor-supplied library of useful routines

  4. Jumps to a location (like a branch but unconditional), and saves current PC (address of next instruction) in R7. saving the return address is called “linking” target address is PC-relative (PC + Sext(IR[10:0])) bit 11 specifies addressing mode if =1, PC-relative: target address = PC + Sext(IR[10:0]) if =0, register: target address = contents of register IR[8:6]

  5. Data Path for JSR

  6. Just like JSR, except Register addressing mode. target address is Base Register bit 11 specifies addressing mode What important feature does JSRR providethat JSR does not?

  7. Data Path for JSRR

  8. Returning from Subroutine • RET (JMP R7) gets us back to the calling routine. • works just like in TRAP

  9. Example: Absolute Value ;; Author: Ken Lambert ;; This program resets the value of the variable NUMBER to its absolute value, using the ABS subroutine .ORIG x3000 ;; Pseudocode design: number = abs(number) ;; Main program register usage: ; R1 = number ; Main program code LD R1, NUMBER ; Set argument for abs JSR ABS ST R1, NUMBER ; Use returned value HALT ; Data for main program NUMBER .BLKW 1 ;; Subroutine ABS ; Converts the number in R1 to its absolute value ; Input parameter R1 = the number to convert ; Output parameter R1 = the number converted ABS ADD R1, R1, #0 ; if R1 < 0 BRzp ENDABS NOT R1, R1 ; R1 = -R1 ADD R1, R1, #1 ENDABS RET .END

  10. Interface to Trap Service Routines • Registers serve as input parameters and output parameters • Examples: • OUT and PUTS use R0 as an input parameter • GETC and IN in use R0 as an output parameter

  11. Passing Data to Subroutines • Input parameters • The values passed in to a subroutine are called its input parameters. • These values are needed by the subroutine to do its job. • Examples: • In ABS routine, R1 is the number to be converted • In OUT service routine, R0 is the character to be printed. • In PUTS routine, R0 is address of string to be printed.

  12. Returning Data from a Subroutine • Output parameters • Values passed back from a subroutine are called output parameters. • These are the results of the subroutine’s computation. • Examples: • In ABS routine, converted value is returned in R1. • In GETC service routine, character read from the keyboard is returned in R0.

  13. Example: Subtraction ;; Author: Ken Lambert ;; This program subtracts the number in the variable SECOND from FIRST and ;; and stores the result in DIFF .ORIG x3000 ;; Pseudocode design: diff = first - second ;; Main program register usage: ; R1 = first ; R2 = second ; R3 = diff ; Main program code LD R1, FIRST ; Set the parameter for the minuend LD R2, SECOND ; Set the parameter for the subtrahend JSR SUB ST R3, DIFF ; Store the returned difference HALT ; Main program data variables FIRST .BLKW 1 SECOND .BLKW 1 DIFF .BLKW 1 ;; Subroutine SUB ; Subtracts R2 from R1 and stores result in R3 ; Input parameters: R1 (minuend) and R2 (subtrahend) ; Output parameter: R3 (difference) SUB NOT R3, R2 ADD R3, R3, #1 ADD R3, R1, R3 RET .END Note that the SUB routine does not modify its input parameters!

  14. The Namespace • A subroutine should communicate with its caller only via registers • A subroutine may have its own data variables, but should not access anyone else’s data variables (those of other routines or the main program) • A subroutine should leave its input registers unchanged (may save and restore)

  15. Saving and Restoring Registers • Called routine -- “callee-save” • At startup, save any registers that will be altered(unless altered value is desired by calling program!) • Before return, restore those same registers • Calling routine -- “caller-save” • Save registers destroyed by own instructions orby called routines (if known), if values needed later • save R7 before TRAP • save R0 before TRAP x23 (input character) • Or avoid using those registers altogether

  16. Saving and Restoring Registers • Generally use “callee-save” strategy,except for return values. • Save anything that the subroutine will alter internally that shouldn’t be visible when the subroutine returns. • It’s good practice to restore incoming arguments to their original values (unless overwritten by return value). • Remember: You MUST save R7 if you call any other subroutine or TRAP.

  17. ;; Author: Ken Lambert ;; Calls the subroutine ORDER to guarantee that FIRST <= SECOND .ORIG x3000 ;; Main program register usage: ; R1 = initial value of FIRST ; R2 = initial value of SECOND ; Main program code LD R1, FIRST LD R2, SECOND JSR ORDER ST R1, FIRST ST R2, SECOND HALT ; Main program data FIRST .BLKW 1 SECOND .BLKW 1 ;; Subroutine ORDER ; Guarantees that R1 <= R2 ; Input parameters: R1 and R2 ; Output parameters: R1 and R2 ; R3 = temporary working storage ORDER ST R3, ORDERR3 ; Save R3 JSR SUB BRnz ENDORD ; Exit if difference <= 0 ADD R3, R2, #0 ; Swap values in R1 and R2 ADD R2, R1, #0 ADD R1, R3, #0 ENDORD LD R3, ORDERR3 ; Restore R3 RET ; Data variable for subroutine ORDER ORDERR3 .BLKW 1 ;; Subroutine SUB . . . Example: ORDER makes R1 <= R2 Is there a bug here?

More Related