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
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:
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
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?
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)
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
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.
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.
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.
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.
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
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
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?
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
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.
>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.