Hallo, ich habe eine Frage, ich habe gerade mit meinem PIC16F887 ein kleines Assembler Programm laufen lassen. Dabei bin ich auf ein komisches verhalten gestoßen, dass ich mir nicht erklären kann. Warum funktioniert das Programm nur, wenn ich vor dem Return noch ein zusätzliches NOP mache ? Darf man nicht zu einem RETURN mit GOTO springen ? ... BTFSS SM_WARTEC_TEMP, 2 GOTO $ + 8 NOP NOP NOP NOP NOP NOP NOP BTFSS SM_WARTEC_TEMP, 3 GOTO $ + 16 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ;NOP ; Ohne dieses NOP funktioniert das Programm nicht. RETURN Wenn ich das mit einem Simulator laufen lasse springt der PC bei dem GOTO $ + 16 irgendwo ganz weit runter (Weit über 200 Adressen weiter).
Wieso arbeitest du eigentlich nicht mit Lables, das macht das Programm mMn übersichtlicher. Tritt der Fehler nur im Simulator auf oder auch im real Life?
Und könnte das weit über 200 auch weit über 2000 bedeuten ? PCLATCH ? http://www.sprut.de/electronic/pic/assemble/befehle.html#goto
Versuch es mal mit
1 | goto D'16' |
Der Interpretiert die 16 als HEX-Zahl. http://www.sprut.de/electronic/pic/assemble/assembler.html#Regeln Ich würde aber trotzdem Lables verwenden, dann funktioniert der Code auch noch wenn du mal ein nop wegnimmst und man sieht gleich wo hingesprungen wird ohne nops zu zählen.
:
Bearbeitet durch User
Ah danke, natürlich gibts Labels, aber ich will nicht für jede kleinigkeit ein Label machen.
Der Programmzähler zeigt immer auf den nächsten Befehl.
1 | BTFSS SM_WARTEC_TEMP, 3 |
2 | GOTO $ + 16 <- während dieser Befehl aufgeführt wird.. |
3 | 0 NOP <- ..steht der Programmzähler hier |
4 | 1 NOP |
5 | 2 NOP |
6 | 3 NOP |
7 | 4 NOP |
8 | 5 NOP |
9 | 6 NOP |
10 | 7 NOP |
11 | 8 NOP |
12 | 9 NOP |
13 | 10 NOP |
14 | 11 NOP |
15 | 12 NOP |
16 | 13 NOP |
17 | 14 NOP |
18 | 15 ;NOP ; Ohne dieses NOP funktioniert das Programm nicht. |
19 | 16 RETURN |
20 | x -> Ziel=PC+x |
Gruß John
John schrieb: > Der Programmzähler zeigt immer auf den nächsten Befehl... Das $ bezieht sich auf die Zeile in es steht, goto $ ist eine Endlosschleife. Das Problem ist, dass der Assembler 16 als 16 hex = 22 dez interpretiert.
Dann muss dies hier wohl falsch sein (Was ist "$"?): http://www.sprut.de/electronic/pic/assemble/assembler.html#W
Sorry, Max H., das bezog sich auf Johns
> Der Programmzähler zeigt immer auf den nächsten Befehl.
S. Landolt schrieb: > Dann muss dies hier wohl falsch sein (Was ist "$"?): > http://www.sprut.de/electronic/pic/assemble/assembler.html#W $ ist die Adresse an der der Befehl steht.
1 | org 0x20 |
2 | goto $+1 |
zum Beispiel setzt
1 | goto 0x21 |
an die Adresse 0x20 Max schrieb: > Ah danke, natürlich gibts Labels, aber ich will nicht für jede > kleinigkeit ein Label machen. Wieso nicht? Du kannst dir ja auch mal das disassembly Listing ansehen und schauen welche absolute Adresse das Sprungziel ist.
:
Bearbeitet durch User
Max H. schrieb: > John schrieb: >> Der Programmzähler zeigt immer auf den nächsten Befehl... > Das $ bezieht sich auf die Zeile in es steht, goto $ ist eine > Endlosschleife. Ja, hab ich verwechselt. $ bezieht sich auf die Zeile in der es steht. Der Programmzähler (PCL) zeigt immer auf den nächsten Befehl.
Max schrieb: > Ah danke, natürlich gibts Labels, aber ich will nicht für jede > kleinigkeit ein Label machen. Glaubst du, dass du mit Befehle zählen schneller bist, als ein Label hinztippen? Frei nach dem Motto: "Wer sein Auto liebt der schiebt.", oder was? Davon abgesehen ist es ein irrer, unnützer Aufwand, denn bei jeder kleinen Änderung im Code musst du alle derartigen Sprünge prüfen, ob sich was verschoben hat. Viel Arbeit und erhebliche Fehlerquellen. Das kann kein einigermaßen vernünftiger Mensch wollen, wenn es deutlich einfacher geht. Und ich weiß, wovon ich rede, denn es gab eine Zeit, da hab ich Assemblerprogramme auf dem Papier entwickelt und in Maschinencode übersetzt, weil es nix anderes gab. - Ist zum Glück viele, viele Jahre her.
1. Was ist wenn dein wilder Sprung > 200 garnicht von den Code-Zeilen kommt die du dir anschaust ? 2. Nimm Labels, die gibts umsonst und machen den Code viel viel lesbarer. 3. Hast du manchmal den Sourcecode oder das Hexfile um es mal in einen Simulator zu quetschen und mal anzuschauen ?
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.