PIC16F887 GOTO RETURN Problem

Gast #4179235
Lesenswert?

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).
Gast #4179416
Lesenswert?

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
#4179425
Lesenswert?

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.
Gast #4179450
Lesenswert?

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.
#4179611
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren