Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
59
Добавлен:
14.04.2015
Размер:
2.03 Mб
Скачать

82

Chapter 3. Writing Assembly Programs

 

 

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:

SJMP Relative jumps include conditional jumps (CJNE, DJNZ, JB, JBC, JZ JC, …) and the unconditional SJMP instruction. The addressable offset JNZ 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 3 destination. The assembler does all the offset computations. If the

address is out of range, the assembler will issue an error message.

ACALL In-block jumps and calls permit access only within a 2KByte block of AJMP 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 Long jumps and calls allow access to any address within a 64KByte LJMP 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. One Philips 80C51MX and Intel/Atmel WM 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.

ECALL Extended jumps and calls allow access within the extended program EJMP space of the Intel/Atmel WM 251 or Philips 80C51MX.

CALL Generic jumps and calls are two instruction mnemonics that do not JMP 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

Shaded directives and options are available only in AX51 and A251.

Keil Software — A51/AX51/A251 Macro Assembler and Utilities

83

 

 

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

3

 

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 Philips 80C51MX and Intel/Atmel WM 251

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

 

 

Shaded directives and options are available only in AX51 and A251.

Соседние файлы в папке HLP