Jumps

Jumps control the flow through a program. Without them a program could only
run from top to bottom. This would be useless.

Nano has three basic jump opcodes. You know already one: "jmp_l".

    jmp         label;                 jumps to label

    jsr         label;                 jumps to subroutine label
    rts;                               return from subroutine

    jmp_l       L, label;              jumps to the label, if "L" is true (1)
    jsr_l       L, label;              jumps to subroutine, if "L" ist true (1)
    
To speed up loops, I combined two opcodes into one:
    eq_jmp_l    L1, L2, label;         jumps to the label, if "L1" is equal "L2"
    neq_jmp_l   L1, L2, label;                             not equal
    gr_jmp_l    L1, L2, label;                             greater
    ls_jmp_l    L1, L2, label;                             less
    greq_jmp_l  L1, L2, label;                             greater or equal
    lseq_jmp_l  L1, L2, label;                             less or equal

    eq_jsr_l    L1, L2, label;         jumps to subroutine, if "L1" is equal "L2"
    neq_jsr_l   L1, L2, label;                             see above!
    gr_jsr_l    L1, L2, label;
    ls_jsr_l    L1, L2, label;
    greq_jsr_l  L1, L2, label;
    lseq_jsr_l  L1, L2, label;
    
See also: Loops

The following example shows how to use the "jsr" opcode:

        mul.na

     1| push_i     33, L0;
     2| push_i     17, L1;
     3|
     4| jsr        multiply;           jump to line "11"
     5| print_l    L2;
     6| push_i	   1, L3;
     7| print_n    L3;
     8| push_i     0, L3;
     9| exit       L3;
    10|
    11| lab multiply;
    12|     mul_l      L0, L1, L2;
    13|     rts;                       jump back to line "5"
   
Prev: Loops | Next: Arrays