Using Jump Tables (JMP @A+DPTR)

16.31 Using Jump Tables (JMP @A+DPTR)

A frequent method for quickly branching to many different areas in a program is by using jump tables. For example, branching to different subroutines based on the value of the accumulator could be accomplished with the CJNE instruc- tion (which has already been covered):

CJNE

A,#00h,CHECK1 ;If

it’s

not zero, jump to CHECK1

AJMP

SUB0

;Go

to

SUB0

subroutine

CHECK1: CJNE

A,#01h,CHECK2 ;If it’s

not 1, jump to CHECK2

AJMP

SUB1

;Go

to

SUB1

subroutine

CHECK2:

 

 

 

 

 

 

This code will work, but each additional possible value increases the size of the program by 5 bytes—3 bytes for the CJNE instruction and 2 bytes for the AJMP instruction.

A more efficient way is to create a jump table by using the JMP @A+DPTR instruction. Like the MOVC @A+DPTR, this instruction calculates an address by summing the accumulator and DPTR, and then jumps to that address. Therefore, if DPTR holds 2000H and the accumulator holds 14H, the JMP instruction jumps to 2014H.

Consider the following code:

RL A

;Rotate accumulator left, multiply by 2

MOV DPTR,#JUMP_TABLE

;Load DPTR with address of jump table

JMP @A+DPTR

;Jump to the corresponding address

JUMP_TABLE: AJMP SUB0

;Jump table entry to SUB0

AJMP SUB1

 

This code first takes the value of the accumulator and multiplies it by two by shift- ing the accumulator to the left by one bit. The accumulator must first be multiplied by two because each AJMP entry in JUMP_TABLE is two bytes long,

The code then loads the DPTR with the address of the JUMP_TABLE and pro- ceeds to JMP to the address of the accumulator plus DPTR. No additional checks are necessary because we already know that we want to jump to the offset indicated by the accumulator. We jump directly into the table that jumps to our subroutine. Each additional entry in the jump table will require only two additional bytes (two bytes for each AJMP instruction).

Note:

It is almost always a good idea to use a jump table if there are two or more choices based on a zero-based index. A jump table with just two entries, like the previous example, saves one byte of memory over using the CJNE ap- proach, and saves three bytes of memory for each additional entry.

16-34

Page 228
Image 228
Texas Instruments MSC1210 manual Using Jump Tables JMP @A+DPTR