Keil Logo

Program Addresses

Program addresses are absolute or relocatable expressions with the memory class CODE or ECODE. Typically, program addresses are used in jump and call instructions. For indirect jumps or calls, it is required to load a program address in a register or a jump table. The following jumps and calls are possible:

Program Addresses Description
SJMP JZ JNZ … Relative jumps include conditional jumps (CJNE, DJNZ, JB, JBC, JC, …) and the unconditional SJMP instruction. The addressable offset is –128 to +127 bytes from the first byte of the instruction that follows the relative jump. When you use a relative jump in your code, you must use an expression that evaluates to the code address of the jump destination. The assembler does all the offset computations. If the address is out of range, the assembler will issue an error message.
ACALL AJMP In-block jumps and calls permit access only within a 2KByte block of program space. The low order 11 bits of the program counter are replaced when the jump or call is executed. For Dallas 390 contiguous mode the block size is 512KB or 19 bits. If ACALL or AJMP is the last instruction in a block, the high order bits of the program counter change and the jump will be within the block following the ACALL or AJMP.
LCALL LJMP Long jumps and calls allow access to any address within a 64KByte segment of program space. The low order 16 bits of the program counter are replaced when the jump or call is executed. For Dallas 390 contiguous mode: the block size is 16MB or 24 bits. On NXP 80C51MX: if LCALL or LJMP is the last instruction in a 64KByte segment, the high order bits of the program counter change and the jump will into the segment following the LCALL or LJMP.
ECALL EJMP Extended jumps and calls allow access within the extended program space of the NXP 80C51MX.
CALL JMP Generic jumps and calls are two instruction mnemonics that do not represent a specific opcode. JMP may assemble to SJMP, AJMP, LJMP or EJMP. CALL may assemble to ACALL, LCALL or ECALL. These generic mnemonics always evaluate to an instruction, not necessarily the shortest, that will reach the specified program address operand.
Example for all 8051 Variants

EXTRN CODE (my_function)

           CSEG    AT    3
           JMP     ext_int              ; an interrupt vector

?PR?myintr SEGMENT CODE                 ; define a segment for program code
           RSEG    ?PR?myintr
ext_int:   JB      FLAG,flag_OK
           INC     my_var
flag_OK:   CPL     FLAG
           RETI
?PR?myprog SEGMENT CODE INBLOCK         ; a segment within a 2K block
           RSEG    ?PR?myprog
func1:     CALL    sub_func             ; will generate ACALL
loop:      CALL    my_function          ; external function -> LCALL
           MOV     A,my_var
           JNZ     loop
           RET

sub_func:  CLR     FLAG
           MOV     R0,#20
loop1:     CALL    my_function
           DJNZ    R0,loop1
           RET
Example with EJMP, ECALL for NXP 80C51MX
EXTRN ECODE:FAR (my_farfunc)

Reset      EQU     ECODE 0FF0000H       ; Reset location on 251

?PR?my_seg SEGMENT ECODE                ; define a SEGMENT of class EDATA
           RSEG    ?PR?my_seg

func1      PROC    FAR                  ; far function called with ECALL
           CALL    func2                ; generates LCALL
           CALL    my_farfunc           ; generates ECALL
           JNB     Flag,mylab
           EJMP    Reset
mylab:     ERET
           ENDP

func2      PROC    NEAR
           CALL    my_farfunc           ; generates ECALL
           RET
           ENDP
  Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.