GOSUB DWORD statement

Purpose | Invoke a subroutine.
Syntax | GOSUB {label | linenumber} GOSUB DWORD dwpointer

Remarks

GOSUB causes execution to branch to the statement prefaced by label or linenumber, after first saving its current location on the stack. The label or linenumber must be local to the Sub, Function, Method, or Property where the GOSUB statement is located. Executing a RETURN statement returns control to the instruction immediately following the GOSUB.

When using GOSUB, be sure that each subroutine returns to its caller gracefully through a RETURN statement. Run-away (recursive) GOSUBs that loop upon themselves will eat up large chunks of stack space, reducing available memory.

All labels and line numbers are private. You cannot GOSUB to a label outside of the current procedure.

For time critical or high-performance code, using a GOSUB to perform a repetitive task is almost always faster then performing a call to a procedure, since there is no overhead in setting up a stack frame for a GOSUB.

DWORD | GOSUB DWORD causes execution to branch to address stored in dwpointer, after first saving its current location on the stack. dwpointer must be a Double word, Long integer, or pointer variable that contains the address of a label that is in the same procedure as the GOSUB DWORD statement. Executing a RETURN statement returns control to the instruction immediately following the GOSUB DWORD statement.
See also | #STACK, FUNCTION, METHOD, ON GOSUB, PROPERTY, SUB, RETURN

Example

FUNCTION DoCalc!(Radius!)

pi# = ATN(1) * 4 ' calculate value of PI

GOSUB CalcArea ' jump to subroutine Radius!

EXIT FUNCTION

CalcArea:

FUNCTION = pi# * Radius! ^2 ' calculate area

RETURN ' return from subroutine

END FUNCTION