Hallo Leute, eine Frage zur Taktbestimmung in Assembler. Der Befehl "brne Loop" kann ja je nach Ergebnis 1 oder 2 Takte benötigen. Aber kann mir jemand sagen bei welchem Ergebnis was zutrifft? Einmal springt er zurück zu "Loop" weil 0 noch nicht erreicht ist und einmal macht er in der nächsten Befehlszeile weiter weil 0 erreicht wurde.
Der Rücksprung zu Loop verbraucht 2 Takte, weil er den PC (und die Pipeline) neu laden muss. Ohne Sprung kann er mit der nächsten Instruktion weiter machen und braucht nix neu laden.
nutz doch den Simulator und schau in die Zeit rein normalerweise Sprung bei !=0 = 1Takt = 0 = 2Takte
schüler schrieb: > Hallo Leute, > > eine Frage zur Taktbestimmung in Assembler. > "Assembler" ist immer an ein bestimmtes Zielsystem gebunden, eigentlich ist deine Frage zu allgemein gestellt. > Der Befehl "brne Loop" kann ja je nach Ergebnis 1 oder 2 Takte > benötigen. > Aber kann mir jemand sagen bei welchem Ergebnis was zutrifft? > Branch not equal Loop --> Die Anweisung prüft das Zero Flag, wenn die Bedingung nicht erfüllt: ein Takt > Einmal springt er zurück zu "Loop" weil 0 noch nicht erreicht ist und > einmal macht er in der nächsten Befehlszeile weiter weil 0 erreicht > wurde. Wenn die Bedingung erfüllt: PC mit Addresse 'Loop' laden = 1Takt + 1Takt = 2Tate
Heinz V. schrieb: > Wenn die Bedingung erfüllt: PC mit Addresse 'Loop' laden = 1Takt + 1Takt > = 2Tate Aber er springt ja wenn die Bedingung nicht erfüllt ist. Also wenn Null - nicht springen - 1 Takt Wenn nicht Null - springen - 2 Takte so richtig??
schüler schrieb: > Also wenn Null - nicht springen - 1 Takt > Wenn nicht Null - springen - 2 Takte > > so richtig?? BRNE = Branch (if) not equal (Zero) = springe wenn nicht Null
Ein Sprung braucht immer mehr Zeit wie wenn es einfach mit dem nächsten Befehl weitergehen würde. Also wenn bei dem Befehl die Sprungbedingung erfüllt ist braucht er auch die meiste Zeit weil die CPU eben springen muss.
Hi Die Ausführungszeiten der einzelnen Befehle stehen in den Unterlagen zum µC. Vll. ganz interessant, wenn man ein Delay recht genau braucht - wobei Das schon zig Mal von zig Leuten programmiert wurde. Wenn Dich die Ausführungszeit interessiert, Die lässt sich sehr wahrscheinlich in Deiner Simulation anzeigen - bei mir AVR-Studio. MfG
schüler schrieb: > bei welchem Ergebnis was zutrifft Wieviel Takte eine CPU braucht, hängt auch davon ab, was sonst noch ist. Wenn der Wert von außen geholt werden muß oder langsame Speicher im Spiel sind, sieht die Welt wieder ganz anders aus. Deswegen sind Zählschleifen selten die beste Lösung.
es gibt auch µC da benötigt ein Schleifenrücksprung 0 Takte das ist aber auch kein klassischer branch
oszi40 schrieb: > schüler schrieb: >> bei welchem Ergebnis was zutrifft > > Wieviel Takte eine CPU braucht, hängt auch davon ab, was sonst noch ist. Nicht beim AVR. Das ist das schöne daran. Er ist noch so einfach, dass die Zeiten tatsächlich exakt so sind wie angegeben. > Wenn der Wert von außen geholt werden muß oder langsame Speicher im > Spiel sind, sieht die Welt wieder ganz anders aus. Welcher Wert? ein Branch-Befehl springt abhängig von den Flags. > Deswegen sind Zählschleifen selten die beste Lösung. Beim AVR klappt das. Das einzige, was die Ausführungszeit bei einer einfachen Zählschleife beeinträchtigen kann, sind Interrupts.
schüler schrieb: > Aber er springt ja wenn die Bedingung nicht erfüllt ist. > > Also wenn Null - nicht springen - 1 Takt > Wenn nicht Null - springen - 2 Takte > > so richtig?? Jain. Er springt, wenn die Bedingung erfüllt ist. Die Bedingung ist 'nicht null' (bzw. not equal) Also springt er, wenn nicht null. BRNE bedeutet 'Branch if not equal' und leitet sich aus einem Vergleich (CP, CPI - compare) ab. Dort werden zwei Werte subtrahiert. Sind beide gleich groß, ist das Ergebnis 0 und damit wird das Z-Flag gesetzt. Also, wenn Z gesetzt, Zahlen gleich, equal. In einer Zählschleife ist beim letzten Durchlauf die Variable bei 0 angelangt und das Z-Flag wird gesetzt. Equal. Solange das aber noch nicht so ist willst Du springen. Also springe bei ungleich. BRNE. Ich mag da ja auch die 8051 Befehle lieber: JZ Jump if Z JNZ Jump if not Z JC Jump if C JNC Jump if not C Da sieht man direkt was man macht und muss nicht noch um eine Ecke denken. Warum schaust Du eigentlich nicht einfach in das Instruction Set Manual? Dort steht es so schön: Cycles: 1 if condition is false 2 if condition is true Gruß Jobst
:
Bearbeitet durch User
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.