Forum: Mikrocontroller und Digitale Elektronik ASM Optimierung


von Paul K. (Gast)


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?
1
lds temp1,Speicher1 ; Zeiger aus dem Speicher lesen
2
subi temp1,11 ; 11 abziehen. Ist das Negativ Flag gesetzt war der Zeiger kleiner 11
3
brmi Kleiner_11 ; Wenn Zeiger kleiner 11 so belasse Speicher1
4
ldi temp1,10 ; Auf 10 setzen
5
sts Speicher1,Zeiger ; Wert in Speicher1 
6
7
Kleiner_11:
8
lds   temp1,Speicher1 ; Zeiger aus dem Speicher lesen
9
10
..
11
..
12
..
13
..
14
15
16
.dseg
17
Speicher1: .Byte 1

von Floh (Gast)


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:

von spess53 (Gast)


Lesenswert?

Hi

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

Es gibt auch Vergleichsbefehle. Die Verändern die Operanten nicht:
1
  lds temp1,Speicher1
2
  cpi temp1,11
3
  brcs Kleiner_11
4
  ....
5
6
Kleiner_11:
7
.....

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

MfG Spess

von Paul K. (Gast)


Lesenswert?

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

von spess53 (Gast)


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

von Paul K. (Gast)


Lesenswert?

1
lds  temp1, Speicher1    ; Zeiger aus dem Speicher lesen
2
cpi  temp1, 11           ; Direkter Vergleich mit 11. Ist temp1 kleiner so wird das C-Flag=1
3
brlo Kleiner_11          ; IF tmep1 kleiner (C-Flag=1) springe zu Kleiner_11
4
ldi  temp1, 10           ; Auf 10 setzen
5
6
Kleiner_11:
7
8
..
9
..
10
..
11
..
12
13
14
.dseg
15
Speicher1: .Byte 1

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

schreiben?

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

von spess53 (Gast)


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

von Paul K. (Gast)


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?

von Peter (Gast)


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)

von spess53 (Gast)


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/doc0856.pdf

MfG Spess

von Paul K. (Gast)


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.

von Paul K. (Gast)


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.

von Peter (Gast)


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.

von Paul K. (Gast)


Lesenswert?

Durch das Instruction Set ist mir ja aufgefallen das BRCS und BRLO wohl 
gleich sind.

von Paul K. (Gast)


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?

von Peter (Gast)


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.

von spess53 (Gast)


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

von Paul K. (Gast)


Lesenswert?

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

von Paul K. (Gast)


Lesenswert?

Wie darf ich das verstehen?

In der Auswertung

von Klaus2m5 (Gast)


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

von Paul K. (Gast)


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?

von spess53 (Gast)


Lesenswert?

Hi

>oder?

Nichts oder. Stimmt so.

MfG Spess

von Vuvuzelatus (Gast)


Lesenswert?

>Plus Null

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

von Paul K. (Gast)


Lesenswert?

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

von dreilira (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

>Da wird man ja kirre.

Das gibt sich mit der Zeit.

MfG Spess

von Paul K. (Gast)


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.

von Thomas (Gast)


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.

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.