Forum: Mikrocontroller und Digitale Elektronik winavr lo8() hi8() problem


von scales (Gast)


Lesenswert?

ich hab ein Problem mit lo8() und hi8() von WinAVR, dazu ein Beispiel 
mit dem Z-Pointer:
1
ldi ZL, [adresse von sprung, manuell eingegeben]
2
ldi ZH, [adresse von sprung, manuell eingegeben]
3
ijmp
4
5
sprung:

springt wie es soll zu sprung.

aber
1
ldi ZL, lo8(sprung)
2
ldi ZH, hi8(sprung)
3
ijmp
4
5
sprung:

springt genau doppelt soweit.

Wenn ich den Code disassemblier steht beim zweiten Beispiel einfach die 
doppelt so große Adresse drin.

Im Moment halbier ich den Z-Pointer hinterher einfach, dann springt er 
genau an die richtige Stelle, aber trotzdem würde mich interessieren 
warum der nicht die richtige Adresse nimmt.

von David M. (md2k7)


Lesenswert?

Hallo,

ein ähnliches Problem hatte ich auch, das löst man so:

ldi ZL, lo8(pm(sprung))
ldi ZH, hi8(pm(sprung))
ijmp

also einfach das pm() Makro verwenden, das halbiert die Adresse.

von scales (Gast)


Lesenswert?

ah danke, damit tuts.

würde mich aber trotzdem interessieren warum da überhaupt die doppelte 
Adresse drinsteht, falls das jemand weis.

von Benedikt K. (benedikt)


Lesenswert?

Ganz einfach:
Der Pointer zählt Bytes, der Programmcounter Befehle (Words).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.