Subroutines
A calculation like “the factorial of a number” may be used several times in a large program. Subroutines allow this kind of functionality to be abstracted into a unit. It’s a benefit for code reuse and generally makes it easier to work with the code too. Even though PASM is just an assembly language running on a virtual processor, it has a number of features to support high-level subroutine calls. IMCC offers a smoother interface to those features.
Stack-Based Subroutine Calls
Unlike most high-level languages, PIR and PASM don’t provide a single statement to call a subroutine, pass in the arguments, and return the result. This is a language designed to implement other languages, and every language does subroutine calls a little differently. What’s needed is a set of building blocks and tools, not a prepackaged solution.
PIR has several directives and
instructions relevant to subroutine calls. The most important is
call
, which simply branches to a subroutine
label. On the side of the caller,
.arg
passes an argument to a subroutine,
and .result
retrieves a result. Within the
subroutine, .param
retrieves an argument passed to the
subroutine, and .return
returns a value to the caller:
.sub _main .local int counter counter = 5 .arg counter # pass an argument call _fact # call the subroutine .local int product .result product # retrieve the result print product print "\n" end .end .sub _fact saveall # save caller's registers .param int N # retrieve the parameter .local ...
Get Perl 6 Essentials now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.