Forum: Mikrocontroller und Digitale Elektronik Assembler Zeit berechnen


von schüler (Gast)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

nutz doch den Simulator und schau in die Zeit rein

normalerweise Sprung bei

!=0 = 1Takt
= 0 = 2Takte

von Heinz V. (heinz_v)


Lesenswert?

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

von schüler (Gast)


Lesenswert?

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??

von Heinz V. (heinz_v)


Lesenswert?

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

von H-G S. (haenschen)


Lesenswert?

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.

von posti (Gast)


Lesenswert?

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

von oszi40 (Gast)


Lesenswert?

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.

von Volle (Gast)


Lesenswert?

es gibt auch µC
da benötigt ein Schleifenrücksprung 0 Takte
das ist aber auch kein klassischer branch

von Rolf M. (rmagnus)


Lesenswert?

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.

von Jobst M. (jobstens-de)


Lesenswert?

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
Noch kein Account? Hier anmelden.