MemorX Skrevet 16. februar 2006 Del Skrevet 16. februar 2006 (endret) Driver med en skoleoppgave, og skal gjøre en divisjon i assembly, og CISC kontrolleren støtter ikke instruksjonen "div", noen som vet hvordan man gjøre en divisjon da? Kontrolleren er en Atmel AVR90S2313. Oppggaven går som følger: Lag et program som: - Leser inn et tall A fra port portd - Leser inn et tall B fra ram adresse 0x80 - Beregner C = A / B (divisjonen går ikke nødvendigvis opp) - Lagre resten av divisjonen på adresse 0x82 i ram - Skriv kvotienten til portb Det meste er jo greit, men hvordan gjøres divisjonen? Takk for all hjelp. Foresten, vi bruker AVR Studio som assembler. Endret 16. februar 2006 av MemorX Lenke til kommentar
Skuggen Skrevet 16. februar 2006 Del Skrevet 16. februar 2006 (endret) Etter at A og B er lest inn kan divisjonen gjøres på følgende måte: C = 0 while(A >= B){ A = A - B; C = C + 1; } rest = A; Du får skrive om koden til assembler selv Divisjonen kan gjøres mer effektivt, se her. Endret 16. februar 2006 av Skuggen Lenke til kommentar
MemorX Skrevet 16. februar 2006 Forfatter Del Skrevet 16. februar 2006 Takker, men nå har vi ikke hatt noe som helst av C++ da Men får ta en titt på det imorgen, og det dokumentet så jo strålende ut, så ta en lang kikk på det når morgenen gryr. Lenke til kommentar
Skuggen Skrevet 16. februar 2006 Del Skrevet 16. februar 2006 Hele algoritmen går ut på at du subtraherer B fra A så mange ganger som mulig. Når A er mindre enn B er du ferdig. C inneholder da det antallet ganger du har trukket B fra A, og A inneholder resten fra divisjonen. A = 17 B = 5 A/B: (1) A = 17 - 5 = 12 (2) A = 12 - 5 = 7 (3) A = 7 - 5 = 2 C = 3 og rest = 2 (A) Det er flere måter å gjøre det på, her er en mulighet: .def A = R16 ; Deklarerer A .def B = R17 ; Deklarerer B .def C = R18 ; Deklarerer C ;21 og 5 er bare eksempelverdier ldi A, 21 ; A = 21 ldi B, 5 ; B = 5 clr C ; C = 0 div_loop: sub A, B ; Subtraherer B fra A brcs div_end ; Ferdig hvis A-B er mindre enn 0 (Branch if carry set) inc C ; Høyner C med 1 hvis subtraksjonen gikk uten underflow rjmp div_loop ; Loop div_end: add A, B ; Legger til B igjen p.g.a. underflow ;Nå står svaret i C og resten i A Her er en PDF med alle AVR-kommandoer Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå