.. 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
Lesezeichen