Gå til innhold

Anbefalte innlegg

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 av MemorX
Lenke til kommentar
Videoannonse
Annonse

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 av Skuggen
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...