A2401: Complex relocatable expression not supported

[ERROR]

Description

A complex relocatable expression has been detected. A complex relocatable expression is detected when the expression contains:

Example
            XDEF offset

  DataSec1: SECTION SHORT

  DataLbl1: DS.B 10

  DataSec2: SECTION SHORT

  DataLbl2: DS.W 15

  offset:   EQU DataLbl2 - DataLbl1
  
Tips

The macro assembler does not support complex relocatable expressions. The corresponding expression must be evaluated at execution time.

Example
  DataSec1: SECTION SHORT

  DataLbl1: DS.B 10

  DataSec2: SECTION SHORT

  DataLbl2: DS.W 15

  Offset:   DS.W 1

  ...

  CodeSec: SECTION

    ...

   evalOffset:

    LD   A, #DataLbl2

    SUB  A, #DataLbl1

    LD  Offset, A

            XDEF  Offset
  
Example
  DataSec1: SECTION SHORT

  DataLbl1: DS.B 10

  DataSec2: SECTION SHORT

  DataLbl2: DS.W 15

  Offset:   DS.W 1

            ; ...

  CodeSec:  SECTION

            ; ...

  evalOffset:

            LD   A,#%lo(DataLbl2)

            SUB  A,#%lo(DataLbl1)

            LD   Offset+1,A

            LD   A,#%hi(DataLbl2)

            SBC  A,#%hi(DataLbl1)

            LD   Offset+0,A
  
Example
  DataSec1: SECTION SHORT

  DataLbl1: DS.B 10

  DataSec2: SECTION SHORT

  DataLbl2: DS.W 15

  Offset:   DS.W 1

  ...

  CodeSec: SECTION

    ...

  evalOffset:

    LDA  #DataLbl2

    SUB  #DataLbl1

    STA  Offset
  
Example
  DataSec1: SECTION SHORT

  DataLbl1: DS.B 10

  DataSec2: SECTION SHORT

  DataLbl2: DS.W 15

  Offset:   DS.W 1

  ...

  CodeSec: SECTION

    ...

  evalOffset:

    LDD  #DataLbl2

    SUBD  #DataLbl1

    STD  Offset

            XDEF Offset
  
Example
  DataSec1: SECTION SHORT

  DataLbl1: DS.B 10

  DataSec2: SECTION SHORT

  DataLbl2: DS.W 15

  Offset:   DS.W 1

            ; ...

  CodeSec:  SECTION

            ; ...

  evalOffset:

            LI   R4,DataLbl1

            LI   R5,DataLbl2

            SUBF R4,R4,R5

            STH  R4,Offset
  
Example
  DataSec1: SECTION

  DataLbl1: DS.B 10

  DataSec2: SECTION

  DataLbl2: DS.W 15

  Offset:   DS.W 1

  ...

  CodeSec: SECTION

    ...

  evalOffset:

           LRW R6,[addLbl1]

           LD.B R7,(R6,0)

           LRW R6,[addLbl1]

           LD.B R7,(R6,0)

           SUBU R7,R8

           LRW R6,[addOff]

           LD.B R7,(R6,0)

           ALIGN 4

  addLbl1: DC.W DataLbl1

  addLbl1: DC.W DataLbl2

  addOff:  DC.W Offset
  
Example
  DataSec1: SECTION SHORT

  DataLbl1: DS.B 10

  DataSec2: SECTION SHORT

  DataLbl2: DS.W 15

  Offset:   DS.W 1

  CodeSec:  SECTION

   MOVE   #DataLbl2, A0

   SUB    #DataLbl1, A0

   MOVE   A0, Offset
  

If both DataSec1 and DataSec2 are in the same section and defined in this module, the assembler can compute the difference:

DataSec1: SECTION SHORT

DataLbl1: DS.B 10

DataLbl2: DS.W 15

offset: EQU DataLbl2 - DataLbl1