Flow Control
Although it has many advanced features, at heart PASM is an assembly language. All flow control in PASM—as in most assembly languages—is done with branches and jumps.
Branch instructions transfer control to a relative offset from the
current instruction. The rightmost argument to every branch opcode is
a label, which the assembler converts to the integer value of the
offset. You can also branch on a literal integer value, but
there’s rarely any need to do so. The simplest
branch instruction is branch
:
branch L1 # branch 4 print "skipped\n" L1: print "after branch\n" end
This example unconditionally branches to the location of the label
L1
, skipping over the first
print
statement.
Jump instructions transfer control to an absolute address. The
jump
opcode doesn’t
calculate an address from a label, so it’s used
together with set_addr
:
set_addr I0, L1 jump I0 print "skipped\n" end L1: print "after jump\n" end
The set_addr
opcode takes a label or an integer offset
and returns an absolute address.
You’ve probably noticed the
end
opcode as the last statement in many
examples above. This terminates the execution of the current run
loop. Terminating the main bytecode segment (the first run loop)
stops the interpreter. Without the end
statement,
execution just falls off the end of the bytecode segment, with a good
chance of crashing the interpreter.
Conditional Branches
Unconditional jumps and branches aren’t really enough for flow control. What you need to implement the control ...
Get Perl 6 and Parrot Essentials, Second Edition 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.