ASM Optimierung

Gast #2068597
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
Gast #2068607
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
Gast #2068614
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
Gast #2068615
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?
Gast #2068626
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?
Gast #2068640
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.
Gast #2068642
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.
Gast #2068742
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
Gast #2068791
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?
Gast #2068855
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.
Gast #2069046
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

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