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.