LA is used to initialize the register specified by operand 1 with the address designated by operand 2. Operand 2 may be expressed using explicit notation ( see Explicit Addressing) or symbolic notation, or a combination of both. Remember that each byte in memory is numbered and that the number assigned to a byte is its address. The address of a field is the address of the first byte of the field. Consider the following example,

 

LA R9,AFIELD

 

 

The address of the fullword AFIELD , x00001000, is copied to register 9, destroying the previous value in R9. The fullword is unchanged by this operation.

 

Since LA is an RX instruction, an index register may be coded as part of operand 2 as in the example below. We assume that register 6 is used as an index register and initially contains x0000002F. When the assembler processes the expression AFIELD(R6), it uses the symbol AFIELD to determine a base register and a displacement, leaving R6 as the index register. The address which is loaded into register 9 is the effective address computed by adding the base register contents, plus the index register contents, plus the displacement:

 

Effective address = C(Base register) + C(Index register) + displacement

 

We assume that the contents of the base register plus the displacement is x00001000. Then the effective address is x00001000 + x0000002F = x0000102F .

 

 

 

 

 

 

 

 

 

 

 

LA R9,AFIELD(R6)

 

 

The example above uses a mixture of symbolic and explicit addressing. The instruction could also be coded using only explicit addresses:

 

LA R9,30(R7,R8)

 

In the example above assume that R7 contains x00001000 and that R8 contains x00000020. R7 is treated as an index register, R8 is the base register, and 30 is a displacement. The effective address is C(R7) + C(R8) + 30 = x00001000 + x00000020 + x0000001E = x0000103E. (Remember that a decimal 30 is 1E in hexadecimal.) After the instruction has executed, R9 contains x0000103E.

 

Some Unrelated Load Addresses

 

R4 = X12121212

R5 = X00000008

R6 = X00000004

Assume that AFIELD has address x00003000.

AFIELD DC F4 AFIELD = X00000004

 

LA R4,AFIELD R4 = X00003000

LA R4,AFIELD(R6) R4 = X00003004

LA R4,AFIELD(R5) R4 = X00003008

LA R4,20(R5,R6) R4 = X00000020 4 + 8 + 20 = 32 = X20

 

Using R0 as an index indicates that no index register is

desired:

 

LA R4,3(R0,R6) R4 = X00000007 4 + 3 = 7

 

 

 

 

Consider the next two consecutively executed instructions.

 

LA R4,AFIELD R4 = X00003000

LA R4,LAFIELD(R0,R4) R4 = x00003004

In the example above, the length attribute (L) is used as

a displacement

 

1. An old assembler joke:

Novice: Whats the difference between a Load instruction and a Load Address

instruction?

 

Old Hand: About a week - of debugging.

 

Seriously, you should pay attention when coding L or LA. Both instructions compute the address of operand 2. In the case of L, the machine retrieves the contents of the fullword in memory at the specified address and places the four bytes in a register. In the case of LA, the address is simply stored in a register.

 

2. The LA instruction is often used to change the location referenced by a DSECT:

 

TEST DSECT

TESTREC DS 0CL80

X DS ...

 

USING TEST,R5

 

LA R5,TABLE POINT AT TABLE AREA

...

LA R5,LTESTREC(R0,R5) MOVE THE DSECT

 

(See DSECTs.)