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
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.