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


von Libby (Gast)


Angehängte Dateien:

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

von fubu1000 (Gast)


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

von Libby (Gast)


Angehängte Dateien:

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?

von Stefan E. (sternst)


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.

von Libby (Gast)


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

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.