Hi, ich habe hier einen Codeschnipsel: BCF 0xa,0x4 adresse 062f BSF 0xa,0x3 0630 goto 0x458 0631 0xa ist PCLATH bei dem Ding. Die Bits 3 und 4 sind die werthöchsten des PC. Demnach landet der Sprung bei 0x458 + 0x1000 + 0x800, richtig? Im Manual lese ich folgendes: The CALL and GOTO instructions provide only 11 bits of address to allow branching within any 2K program memory page. When doing a CALL or GOTO instruction, the upper 2 bits of the address are provided by PCLATH<4:3>. When doing a CALL or GOTO instruction, the user must ensure that the page select bits are programmed so that the desired program memory page is addressed. If a return from a CALL instruction (or interrupt) is executed, the entire 13-bit PC is popped off the stack. unter 2.4 Memory Paging. Wenn ich richtig verstehe muss ich die beiden Bits vor einem Call oder Goto setzen. Bei einem Rücksprung aus einem Call kommt er aber automatisch an die richtige Stelle zurück. Demnach müsste beim goto nichts auf den Stack gepackt werden, ich frage nur zu sicherheit auch wenn es eigentlich logisch ist. Was ist, wenn ich die Bits in PCLATH setze und den goto oder call nicht ausführe? Immerhin habe ich den PC ja eigentlich trotzdem "verbogen"...oder sind das "schattenbits" die wirklich nur bei call oder goto übernommen werden? JJ
Jens schrieb: > Demnach müsste beim goto nichts auf den Stack gepackt werden, nö, nur der call-Befehl kopiert die Rücksprungadresse auf den Stack. Jens schrieb: > Immerhin habe ich den PC ja eigentlich trotzdem > "verbogen". nö, nur das PCLATH-Register. das hat mit dem PC (PCH, PCL) nix zu tun, außer daß beim CALL oder GOTO die beiden Bits ins PCH-Register kopiert werden. (siehe Figure 2-5 im Datenblatt). Die Überraschung kommt dann beim nächsten call oder goto-Befehl. Übrigens: nach einem RETURN-Befehl steht PCLATH in der Regel immer noch auf dem Wert der vor dem CALL-Befehl hineingeschrieben wurde. Also nach dem call immer schön die Register wieder auf die richtige Page stellen. Gruß Anja
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.