Guten Tag,
Seit kurzem versuche ich mich mit Assembler und benutze AtmelStudio 6.
Da ich absoluter Beginner mit Assembler bin, simuliere ich hauptsächlich
und versuche so, den Programmablauf zu verstehen.
Aber:
Ich habe eine "Funktion" div, die eine Division durchführen soll . Diese
rufe ich auf, lass sie durchlaufen und beende sie mit ret. Erwarten
würde ich, dass das Programm an der Stelle weiter läuft, wo ich die
Funktion aufgerufen habe. Tut es aber nicht. Das Programm startet wieder
bei dem ersten Befehl ldi r22,8 und nicht in der main-Schleife. Wieso?
Code:
1
.def zaehler=r24
2
.def nenner=r18
3
.def ergebnis=r21
4
5
.cseg
6
7
ldi r22, 8
8
ldi zaehler,27
9
ldi nenner, 26
10
11
ldi r19,0b10000000 ;höchstes bit vom zähler wird rausgegriffen
12
mov r23, r19
13
14
rcall div
15
16
main:
17
rjmp main
18
19
DIV:
20
mov r20, r19
21
and r20,zaehler
22
23
cp r20,nenner ;zähler und nenner werden verglichen
24
brlo null ;wenn.
25
inc ergebnis
26
sub zaehler,nenner ;Teiler gefunden, ergebnis +1 und voneinander abziehen
Oliver schrieb:> Stackpointer nicht gesetzt.>> Oliver
Meine Herren... Eine Suche nach Stackpointer hätte mich schon vor einer
Stunde ans Ziel gebracht.
Danke Oliver! Jetzt funktionierts!
Hallo ich grüsse Dich,
kannst Du mir bitte das modifizierte jetzt funktionierende Programm
zusenden.
Bin absoluter Neuling.
Vielen Dank im Voraus
Hans Günther
Hans Günther schrieb:> kannst Du mir bitte das modifizierte jetzt funktionierende Programm> zusenden.> Bin absoluter Neuling.
Dann muß es dir jemand sagen: Die Routine taugt nix. Das einzige Gute,
was man darüber sagen kann, ist daß sie richtig rechnet.
Zumindest meistens, Division durch Null wird nicht abgefangen und der
Mann hat auch vergessen, das Summierregister vor dem Eintritt in die
Schleife zu nullen, sie rechnet also mit einiger Wahrscheinlichkeit nur
beim ersten Aufruf richtig, danach nicht mehr.
Außerdem rechnet sie aber auch noch extrem ineffizient. Im schlimmsten
Fall (nämlich: 255/1) braucht sie über 2600 Takte. Das ist lächerlich
viel für ein 8 Bit Division. In der Zeit kann man eine 48 Bit Division
erledigen.
Ein Beispiel dafür, wie man es richtig macht, kannst du im Tutorial zur
AVR-Arithmetik finden.
c-hater schrieb:> Hans Günther schrieb:>>> kannst Du mir bitte das modifizierte jetzt funktionierende Programm>> zusenden.>> Bin absoluter Neuling.>> Dann muß es dir jemand sagen: Die Routine taugt nix. Das einzige Gute,> was man darüber sagen kann, ist daß sie richtig rechnet.
Harsche, wenn auch nicht unberechtigte Kritik.
Allerdings etwas 'Gutes' muss man noch dazu sagen: "nahezuVerzweifelt"
hat sie (oder dürfte sie) selbst geschrieben haben. Wenn auch noch
ungelenk und ineffizient (mein allererstes Sortierprogramm, damals noch
in BASIC, möchtest du lieber nicht sehen), aber selbst geschrieben. Er
hat sich was überlegt und es umgesetzt. Und das ist schon mal ein Punkt,
der gerade bei einem Neuling vieles aufwiegt. Insbesondere denen
gegenüber (Hans Günther) die das nicht haben und noch nicht mal selbst
probieren eine eigene Idee in die Tat umzusetzen.
Karl Heinz Buchegger schrieb:> Allerdings etwas 'Gutes' muss man noch dazu sagen: "nahezuVerzweifelt"> hat sie (oder dürfte sie) selbst geschrieben haben. Wenn auch noch> ungelenk und ineffizient (mein allererstes Sortierprogramm, damals noch> in BASIC, möchtest du lieber nicht sehen), aber selbst geschrieben. Er> hat sich was überlegt und es umgesetzt. Und das ist schon mal ein Punkt,> der gerade bei einem Neuling vieles aufwiegt.
Das ist wohl wahr. Trotzdem irgendwie der falsche Weg. Oder vielmehr:
Das allein ist der falsche Weg.
Sich die Ergebnisse der erfahrenen Programmierer zunutze zu machen ist
schon richtig. Allerdings nicht in der Form dümmlicher
Copy&Paste-Operationen der Vorlage, da hast du natürlich absolut recht,
sondern darin, zu versuchen, den Code zu verstehen. Das Durchsteppen im
Simulator hilft da allerdings auch kaum, wenn man die Idee des
Algorithmus grundsätzlich nicht versteht.
Wenn das aber gelingt, dann ist der Knoten geplatzt. Und dann ist es
auch kein Problem mehr, den 32 Bit Code des Tutorial-Beispiels zu einer
8 Bit Variante zu shrinken oder zu einer 48 Bit Variante zu erweitern.