mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ASM Optimierung


Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leutz
Ich Programmiere in Bascom und möchte nun auf Assembler umsteigen.

IF Speicher1>10 then Speicher1=10, habe ich versucht in Assembler 
umzusetzen. Und überlege ob das nicht noch einfacher geht. Könnte da mal 
jemand drüber schauen?
lds temp1,Speicher1 ; Zeiger aus dem Speicher lesen
subi temp1,11 ; 11 abziehen. Ist das Negativ Flag gesetzt war der Zeiger kleiner 11
brmi Kleiner_11 ; Wenn Zeiger kleiner 11 so belasse Speicher1
ldi temp1,10 ; Auf 10 setzen
sts Speicher1,Zeiger ; Wert in Speicher1 

Kleiner_11:
lds   temp1,Speicher1 ; Zeiger aus dem Speicher lesen

..
..
..
..


.dseg
Speicher1: .Byte 1

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR?
Es gibt Register, auf denen du sofort Vergleiche mit Konstanten machen 
kannst, r16 - r31.

also etwa so:

lds r16, Speicher1
cpi r16, 11
brlo nicht_groeser_10
  ldi r16, 10
  sts Speicher1, r16
nicht_groeser_10:

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>lds temp1,Speicher1 ; Zeiger aus dem Speicher lesen
>subi temp1,11

Es gibt auch Vergleichsbefehle. Die Verändern die Operanten nicht:
  lds temp1,Speicher1
  cpi temp1,11
  brcs Kleiner_11
  ....

Kleiner_11:
.....

Vorsicht mit Befehlen wie brmi. Das Negative-Flag sagt nur, das das 
Ergebnis im Bereich von 128...255 liegt.

MfG Spess

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo liegt der Unterschied zwischen BRCS und BRLO? Beide springen doch bei 
c=1.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Wo liegt der Unterschied zwischen BRCS und BRLO? Beide springen doch bei
>c=1.

Das sind nur verschieden Mnemomics für den gleichen Befehl. Eigentlich 
kommt man, wenn man die Befehle verstanden het, zu 99% mit brne, breq, 
brcc und brcs aus.

MfG Spess

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lds  temp1, Speicher1    ; Zeiger aus dem Speicher lesen
cpi  temp1, 11           ; Direkter Vergleich mit 11. Ist temp1 kleiner so wird das C-Flag=1
brlo Kleiner_11          ; IF tmep1 kleiner (C-Flag=1) springe zu Kleiner_11
ldi  temp1, 10           ; Auf 10 setzen

Kleiner_11:

..
..
..
..


.dseg
Speicher1: .Byte 1

Das ist also besser da kürzer und somit schneller? Also könnte ich auch
BRCS  Kleiner_11  ; IF tmep1 kleiner (C-Flag=1) springe zu Kleiner_11 

schreiben?

Würde sich was in der HEX Datei ändern?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Würde sich was in der HEX Datei ändern?

Nein. Brlo und brcs (und auch brbs 0,...) erzeugen den gleichen Code.

MfG Spess

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um die Befehle zu verstehen, schau ich mir dem Simulator des AVR Studio 
das SREG an.  Bei dem Befehl CP passiert folgendes.

cp 10,0
cp 10,5
cp 10,9
cp 10,10 z=1
cp 10,11 H=1 S=1 N=1 C=1
Klar ist das die Zahlen hinter dem cp, Register sind. Ich schreibe mir 
nur die Werte auf damit es übersichtlicher bleibt. Kann ich das so 
machen und dadurch richtige Ableitungen erkennen?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul K. schrieb:
> Kann ich das so
> machen und dadurch richtige Ableitungen erkennen?

warum schaust du nicht ins Datenblatt, dort steht genau für jeden Befehl 
da auf welche Register es eine Auswirkung hat. (bzw. In der Hilfe)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

<warum schaust du nicht ins Datenblatt, dort steht genau für jeden 
Befehl
>da auf welche Register es eine Auswirkung hat. (bzw. In der Hilfe)

Besser das Instruction Set:

http://www.atmel.com/dyn/resources/prod_documents/...

MfG Spess

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil ich es so besser auffasse. Etwas zu sehen finde ich besser als 
etwas zu lesen. Wobei Deine Aussage meine Frage nicht beantwortet aber 
besten Dank für deinen Hinweis.

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Instruction Set benutze ich um einen überblick über die Befehle zu 
bekommen. Zur Kontrolle ob ich das richtig verstanden habe gehe ich das 
mit dem Simulator noch mal durch und hoffe das dieser Weg richtig ist.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul K. schrieb:
> Weil ich es so besser auffasse. Etwas zu sehen finde ich besser als
> etwas zu lesen.

dabei muss du aber alle Fälle erst testen. Denn ein

cp 10,10

kann andere flags setzen als ein

cp 210,210

denn die 210 kann als negative zahl gesehen werden weil der erste bit 1 
ist.

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Durch das Instruction Set ist mir ja aufgefallen das BRCS und BRLO wohl 
gleich sind.

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das gerade mal getestet

cp 10,10 z=1
cp 210,210 z=1

Es ist beides gleich. Wo liegt da nun der Unterschied?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul K. schrieb:
> Es ist beides gleich. Wo liegt da nun der Unterschied?

ja ok, bei CP ist es kein unterschied weil es ja ein vergleich ist. Es 
gibt aber anweisungen wo es unterschiedlich ist. Habe jetzt leider kein 
Beispiel.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Es ist beides gleich. Wo liegt da nun der Unterschied?

Es gibt keinen. Hier irrt Peter. Die Flags werden immer gleich gesetzt. 
Der Unterschied ist nur in der Auswertung.

MfG Spess

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich fange erst an mich von Bascom auf Assembler umzustellen so führe 
mich bitte nicht in die Irre.

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie darf ich das verstehen?

In der Auswertung

Autor: Klaus2m5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Verständnis: Ein CP ist ein SUB ohne das Ergebnis zu speichern. Die 
Flags werden identisch gesetzt und es kommt nur darauf an, was die 
Differenz ergibt, also 10-10=0 und 210-210=0 - beides Plus Null ohne 
Übertrag

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Somit ist die Auswertung doch OK. Solange ich CP als vergleich nehme 
komplementär mit Bascom IF xyz=10 bzw IF xyz<10 oder IF xyz>10.

Bei
xyz=10
cp xyz,10 wird in Sreg Z=1

xyz=9
cp xyz,10 wird in Sreg C=1

xyz=11
cp xyz,10 wird in Sreg c=0 und Z=0

oder?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>oder?

Nichts oder. Stimmt so.

MfG Spess

Autor: Vuvuzelatus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Plus Null

Oh! Gibt es auch Differenzen, die Minus Null ergeben?

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Somit ist der Schritt zur Umsetzung von Bascom zu Assembler doch 
richtig.
Da wird man ja kirre.

Autor: dreilira (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Paul
es hat ja niemand widersprochen, daß die Umsetzung richtig sei. Nur hast 
Du nach Optimierung gefragt, und da gibt's halt einige 'Tips und 
Tricks'.

Gruß
Ralf

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Da wird man ja kirre.

Das gibt sich mit der Zeit.

MfG Spess

Autor: Paul K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese Tipps sind auch sehr Hilfreich, wofür ich mich auch bedanke. Die 
daraus sich entwickelte Frage, zum unterschied von brlo und brcs 
brachten das Thema auf die Vergleiche. Einige daraus resultierenden 
Antworten waren für mich einwenig irreführet. In meinem Alter lernt man 
nicht mehr so schnell.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>IF Speicher1>10 then Speicher1=10, habe ich versucht in Assembler
>umzusetzen. Und überlege ob das nicht noch einfacher geht. Könnte da mal
>jemand drüber schauen?
> [..]
>Somit ist der Schritt zur Umsetzung von Bascom zu Assembler doch
>richtig.
>Da wird man ja kirre.

Hallo Paul,

anhand des Topics "ASM Optimierung" vermute ich, dass du einen möglichst 
schnellen Code erhalten möchtest. Aber mit dieser Denkungsweise macht 
man sich das Leben schwer und verzettelt sich zu sehr mit Kleinigkeiten, 
die mit einer hohen Warscheinlichkeit - ausser dein Profiling sagt dir 
etwas anderes - einer Optimierung nicht bedürfen (siehe dazu guten 
Aritkel über Optimierung in diesem Forum).
Stattdessen muss man in viel größeren Dimensionen denken - weg von 
"Bitschubsen". Für diese Kleinigkeiten sind Compiler, die du zuvor mit 
paar Instruktions-Hinweisen für die Optimierung fütterst, zuständig. 
Vielmehr muss die Frage lauten, wie "designe" ich mein Programm, das mir 
Flexibilität wie nötig und einen möglichst geringen Overhead und 
Speichereinsparung gibt sowie mir schon beim ersten Anblick dessen 
logische Struktur offenbart (Modularisierung, Hard- und 
Softwareschnittstelle)
Um dir dies zu verdeutlichen, gibt es zwei Extreme:

A) "Bitschubsen" in seiner Perfektion, dafür ist das Programmdesign 
mittelmässig bis schlecht
B) Mittelmässiges "Bitschubsen", dafür ist das Programmdesign gut

In diesem Fall würde B) bei "kompexeren" Aufgabenstellungen das Rennen 
machen, weil der Compiler dein ganzes Programm im Überblick kennt 
(Multifile Compilation) und ihm zuvor paaar Hinweise für optimierungen 
gegeben hast.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.