Forum: Mikrocontroller und Digitale Elektronik Assemblersimulation mit AVR Studio 6


von nahezuVerzweifelt (Gast)


Lesenswert?

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
27
28
    lsr r19
29
    add r19,r23
30
31
    rjmp DIV
32
33
null:  
34
    lsr r19
35
    add r19,r23
36
    dec r22
37
    brne DIV
38
    ret

von Oliver (Gast)


Lesenswert?

Stackpointer nicht gesetzt.

Oliver

von nahezuVerzweifelt (Gast)


Lesenswert?

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!

von Hans Günther (Gast)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Spess53 (Gast)


Lesenswert?

Hi

>Ein Beispiel dafür, wie man es richtig macht, kannst du im Tutorial zur
>AVR-Arithmetik finden.

Oder direkt bei Atmel:

http://www.atmel.com/Images/doc0936.pdf
http://www.atmel.com/Images/AVR200.zip

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

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.

von c-hater (Gast)


Lesenswert?

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.

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.