mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Stack underflow 32 bit durch 1024


Autor: Libby (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich möchte einen 32 Bit Wert durch 1024 teilen. Der 32 Bit Wert liegt 
somit in vier Register vor. Das Dividieren durch 1024 kann ja durch 
10-maliges shiften nach rechts geschehen. Da das Shiften jedoch jeweils 
nur für 8Bit ist, habe ich mir ein Programm geschrieben.
Nur leider produziere ich dabei ein Stack-Underflow:
AVR Simulator: Stack Underflow at 0x0024
AVR Simulator: Invalid opcode 0xffff at address 0x006060
AVR Simulator: Invalid opcode 0xffff at address 0x002061

Kann mir einer sagen, wo ich dies mache und wie ich dies unterbinden 
kann. Evt. habt ihr sogar bessere Lösungen, um ein 32 Bit Wert durch 
1024 zu teilen.

Info: Ich programmiere in Assembler (totaler Anfänger), AVR-Studio, 
ATMega32

Autor: fubu1000 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
1.)Kompiliert das überhaupt???

        ldi temp1, 0xA0
  mov Res3, temp1      ;->das ist gar nicht deklariert worden !!!
  ldi temp1, 0x7F
  mov Res4, temp1
  ldi temp1, 0x88
  mov Res5, temp1
  ldi temp1, 0x02
  mov Res6, temp1

2.)Du wirfst ja die untersten 8bit weg und schiebst dann 2mal rechts. In 
der korregieren Zeugs machste dann "or", das ist falsch, da musste add 
machen und falls Überlauf, das nächst höhere Register nochmal adc 
machen.

GRUSS

Autor: Libby (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry
da ist wohl was falsch gelaufen bei dem Onlinestellen.
Das kommt, wenn man mit mehreren Einzelteilen arbeitet und dann alles in 
eine Versionen packen will und dann das Ganze wieder kopiert.

Aber stimmt mit der Deklaration.

Weiter unten sollte es eigentlich heißen

  ldi temp1, 0xA0
  mov Res4, temp1
  ldi temp1, 0x7F
  mov Res5, temp1
  ldi temp1, 0x88
  mov Res6, temp1
  ldi temp1, 0x02
  mov Res7, temp1

Ja ich weiss, so toll sieht das nicht aus mit den "korrgieren" Marken.
Hat jemand vielleicht ne bessere Lösung?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie gehst du die Sache etwas merkwürdig an.

; 8 Bit nach rechts schieben

mov Res4, Res5
mov Res5, Res6
mov Res6, Res7
clr Res7

; weitere 2 Bit nach rechts schieben

lsr Res6
ror Res5
ror Res4

lsr Res6
ror Res5
ror Res4


PS: Ich gehe davon aus, dass der 32-Bit-Wert kein Vorzeichen hat.

Autor: Libby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok vielen Dank
hab mir schon gedacht, dass das einfacher geht.
Hatte auch schon von den ror Befehlen gelesen.
Nur muss man erst mal checken wofür die gut sind!

Also danke nochmal

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.