Assembler Zeit berechnen

Gast #4864484
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.
#4864499
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
Gast #4864933
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
Gast #4864988
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.
#4865316
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.
#4865358
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

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