Assemblersimulation mit AVR Studio 6

Gast #3213651
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
Gast #3214951
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.
#3214965
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.
Gast #3215026
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.

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