Hallo Leute, ich muss ein Assembler-Programm möglichst genau timen. Dabei kommt es darauf an das verschiedene Aktionen haargenau gleich lange dauern. Dazu müsste ich jetzt wissen wie lange bestimmte Befehle in Assembler brauchen. Ich habe nun auf avr-asm-tutorial eine Befehlsliste gesehen, die hat mir sehr geholfen, nur sind noch folgende Fragen offen: 1. Kostet mich eine Sprungmarke (also das definieren, nicht das dorthin springen) einen Befehl? 2. Wieviel Kostet mich ein Sprung mit brcc? In der Liste steht nur 1/2, was gilt wann? Ich nehme mal an wenn gesprungen wird, dann 2, sonst 1. Oder andersherum? 3. Wiso kosten ein rjmp und ein brcc gleich viel? Das heißt ja das das vergleichen garnichts kostet oder nicht? 4. Nimmt ein NOP immer genau einen Befehl? Ich danke schonmal Dominik
1. nein 2. vermutlich 3. kann man im "Instruction Set" nachlesen. Das gibt es bei Atmel zum herunterladen. 4. ja
1) Nein, der Compiler schreibt die Adresse anstelle der sprungmarke, kostet also nix extra 2) 1 = nicht / 2 = sprung (bin aber nicht 100% sicher ggf einfach mal simmulieren!) 3) brcc vergleicht nichts... Der Vergleich wird vorher gemacht (cmp .. add ... sub ... ) 4) 1 Taktzyklus
1. was für einer sollte das sein? 2. ja 3. brcc vergleicht nichts 4. an was denkst du das so? mal macht er aus einem Befehl einen, manchmal aber auch eindreiviertel?
1. Nein. Der Assembler setzt dies dann in eine Zahl um (beim Sprungbefehl). 2. ... 3. Verglichen wird nicht beim Sprung, sondern bei Operationen oder mit tst. Das wird dann in Flags gespeichert, auf die sich der Sprungbefehl bezieht. 4. @a.k.: Ja, der nop-Befehl dümpelt faul ein bisschen vor sich her, deswegen heisst er ja auch so.
1.In der Regel schreibt der LINKER die Adressen,der Compiler/Assembler lässt Symbole drin stehen.Deshalb auch der Linker-Fehler "Undefined Symbol Referenced in Module xyz".Ob´s beim AVR-Assembler ebenso ist hab ich jetzt nich nachgeschaut,geh aber mal stark davon aus. 2. Ein Takt die Flags vergleichen,ein weiterer für den Sprung(Adresse in den PC laden).Wird nicht gesprungen erübrigt sich der letzte Takt. 3.siehe 2. 4.Jeder Befehl nimmt genau einen Befehl.Die Grösse des erzeugten Opcodes hängt dann vom Befehl ab.Wieviele Taktzyklen dann zur Ausführung benötigt werden ist wieder eine andere Sache.Die meisten benötigen beim AVR genau einen Takt.Welche nicht steht im Datenblatt. Übrigens ist es nicht selbstverständlich,das jeder Takt von der Haupttaktquelle (also 1 Million Takte pro Sekunde bei 1MHz) auch ein Maschinenzyklus ergibt.Einige ältere Architekturen benötigen mehrere Takte für einen Maschinenzyklus.
Danke für die Antworten. Hätte noch eine Frage aus der gleichen Kategorie: Wie sieht es mit sbis aus? Wann braucht das 1, wann zwei und wann 3 Befehle? Welche drei Zustände kann der Befehl überhaupt haben, mir fallen eigentlich nur zwei ein (Pin is 1, Pin is 0). Danke schonmal TO
Du solltest dir mal bei Atmel das PDF mit "AVR Instruction Set" runterladen. Da ist jeder Assembler-Befehl nochmal im Detail erklärt. Da steht das auch mit dabei. Zum sbis: 1 Taktzyklus, wenn er nicht springt, 2 wenn er springt und der nächste Befehl ist 1 Wort (16 bit) groß, 3 wenn er springt und der nächste Befehl ist 2 Worte groß.
Boaa... Seid ihr alle langsam (und vor allem noch spät auf)! ;)
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.