.. gross wie ein Fenster, auf Rollen ..
Is ja noch schlimmer mit dir als angenommen

Mit den Label im Programmspeicher muß man aufpassen: Der µC hat da zwei Begriffe: Worte und Bytes.
Instructions brauchen ja immer 16-Bit, also zwei Byte, während irgendwelche Daten (im Prog-speicher) nur auf Byte ausgerichtet sind.
Konkret:
wenn du schreibst
Code:
$asm
    rcall     labello           
    ...
labello:
    ret
$end asm
klappt das tadellos

Bascom gibt aber immer die Byteaddresse zurück
Code:
DIM addr AS WORD
DIM dat   AS BYTE
        addr = loadlabel (labello)           ' byteaddresse
        dat = CPEEK(addr)                  ' dat = &H41
   ......
labello:
     DATA    &H41
Wenn du aber dort hinjumpen willst, mußt du addr / 2 nehmen (->wortadresse)
Code:
DIM addr AS WORD
        addr = LOADLABEL (labello)           ' byteaddresse

     $ASM
 '-----   variable "addr" in register "Z" laden -----
      LOADADR  addr, X       ' variable "addr" (SRAM)
      LD     zl, X+               '  Reg z  load
      LD     zh, X+             
 '-----   register "Z" / 2 -----
      LSR   zh               
      ROR  zl  
 '-----   Call  register "Z" -----
      ICALL                      ' call  Z
     $END ASM
    

   ......
labello:
    ..
    return
Verständlich oder kryptisch ?

BTW: ob der label innerhalb "$ASM" definiert wird oder ein "bascomlabel" ist, ist egal