Keil Logo Arm Logo

A251 User's Guide

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. For 251: 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.
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 251 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

arm-logo-small

Keil logo
Important information

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