PIC18 Befehl: BRA

Hallo allerseits,

es geht um den Assembler-Befehl "BRA" von [1] auf S. 375.

Anwendung
Code:
bra n
Beschreibung
Add the 2's complement number 2n to the PC. Since the PC will have incremented to fetch the next instruction, the new address will be PC + 2 + 2n. This instruction is a two-cycle instruction.
PC steht für Processor Count.

Angenommen, ich habe eine Instruktion

Code:
mache:   decfsz     X,1,0
         bra        mache
         return

decfsz ist auf Seite 383 beschrieben und steht für Dekrement, bis X=0.

Ich denke, dass ich hier so lange "X" um 1 reduzieren, bis X=0 und dann erst return erreiche. D.h. "bra" überspringt den nächsten "gefetchten" Befehl "return" und führt "mache" erneut aus. Ich kann mir nur dieses Vorgehen anhand der Beschreibung nicht erklären, falls meine Interpretation überhaupt korrekt ist. Nach meiner Interpretation is obiger ASM-Code identisch zu

Code:
for(X; X>0; X--); bzw. while(X>0) do X-=1;

[1] http://ww1.microchip.com/downloads/en/DeviceDoc/39775b.pdf
 
Zuletzt bearbeitet:
Mit DECFSZ kannst du die Bedingung doch selbst steuern. BRA brauchst eigentlich nicht.

http://www.sprut.de/electronic/pic/assemble/befehle.html#decfsz
 
Macht BRA daraus nicht erst eine Schleife?

Also

Code:
BRA n
bewirkt einen Sprung auf
Code:
PC+2+2n
Das Unlogikproblem hierin sehe ich nur darin, dass PC+2+2n doch nicht die Adresse von "n" ist.

Ich friemel mal die neue Adresse auf:

PC ist der aktuelle Prozessor Count.
+2 überspringt den aktuell gefetchten Befehl (also der, der als nächstes ausgeführt werden würde), indem die 4 Phasen des Prozessor übersprungen werden.
+2n geht zum Anfang der Adresse von n. <- das hier ist nur eine Vermutung

Ich sehe einen Speicherbaustein eher so, dass ich auf die einzelnen Sektoren mit Zeigern in Hex (jedenfalls hier so realisiert) zeigen kann. Der aktuelle Zustand wird dann entsprechend dem Befehl ausgelesen, verschoben, gelöscht, what ever.

Sortiere ich mir den Speicher nach den Adresse, würde ich im 16-Bit Fall eine Branch wie folgt erhalten
[0x0, 0x1, ..., 0xF, 0x10, ..., 0x1F, ... 0x100, ... 0xFFF, ..., 0xFFFF] (Ich hoffe, dass es deutlich wird)

Angenommen n liegt in 0x1F. Dann springe ich doch auf PC+2+2n. PC ist der Stand nach der Ausführung von "n" "+2" ist ein Befehl weiter, wo auch immer dieser im Speicher liegt. Nun +2n wäre dann 2*0x1F. Was mir aber zeigt, dass meine Herangehensweise/Interpretation nicht unbedingt korrekt ist.
 
Zuletzt bearbeitet:
Zurück
Oben