6.1.1.7 Long Jumps And Calls

The assembler recognizes several mnemonics that expand into regular PIC MCU assembly instructions. The mnemonics are fcall and ljmp.

On baseline and mid-range parts, these instructions expand into regular call and goto instructions respectively, but also ensure the instructions necessary to set the bits in PCLATH (for mid-range devices) or STATUS (for baseline devices) will be generated, should the destination be in another page of program memory. Page selection instructions can appear immediately before the call or goto, or be generated as part of, and immediately after, a previous fcall/ljmp mnemonic.

On PIC18 devices, these mnemonics are present purely for compatibility with smaller 8-bit devices and are always expanded as regular PIC18 call and goto instructions.

These special mnemonics should be used where possible, as they make assembly code independent of the final position of the routines that are to be executed. Whether the page selection instructions are generated, and exactly where they will be located, is dependent on the surrounding source code. If the call or goto is determined to be within the current page, the additional code to set the PCLATH bits can be optimized away.

The operand to the fcall and ljmp mnemonics should not be masked, regardless of target device. The full address is required to determine the destination address and page (where applicable). When the mnemonic is expanded, the address used with either the call or goto instruction in the expansion will be automatically masked. When using a call or goto instruction directly in your source code, always apply the appropriate mask to the operand.

The following mid-range PIC example shows an fcall instruction in the assembly list file. You can see that the fcall instruction has expanded to five instructions. In this example, there are two bit instructions that set/clear bits in the PCLATH register. Bits are also set/cleared in this register after the call to reselect the page that was selected before the fcall.

13  0079  3021                      movlw   33
14  007A  120A  158A  2000          fcall   _phantom
          120A  118A
15  007F  3400                      retlw   0

Since fcall and ljmp instructions can expand into more than one instruction, they should never be preceded by an instruction that can skip, e.g., a btfsc instruction.

The fcall and ljmp instructions assume that the psect that contains them is smaller than a page. Do not use these instructions to transfer control to a label in the current psect if it is larger than a page. The default linker options will not permit code psects to be larger than a page.

On PIC18 devices, the regular call instruction can be followed by a “,f” to indicate that the W, STATUS and BSR registers should be pushed to their respective shadow registers. This replaces the “,1” syntax indicated on the device data sheet.