Permalänk

Assembler kod, .

Så jag försöker att göra något ganska simpelt

Jag har ett minne som spara 8-bitar 50 gånger i olika delar av minnet, jag vill läsa en bit sedan ändrar jag platsen i minnet. Sammanlagt läser jag ut 10 8-bitar. Jag vill inte läsa minnet under 0 eller över 50.

INT1: LDI NUM,0x0A ;ladda med 10 då vi vill läsa 10 gånger ADD MEMORY,NUM CP MEMORY,MAX ;kollar om vi är över 50 (MAX =50) BRLO SUBREADOUT ;om inte över 50 läs minnet 10 gånger SUB EEADDR2,NUM ;om över 50 gå till baka där vi var och gå ut ur int1 RETI INT2: LDI NUM,0x0A SUB MEMORY,NUM BRMI SUBREADOUT ;om under 0 lägg till 10, annars läs minnet 10 gånger ADD MEMORY,NUM RETI SUBREADOUT: SUB MEMORY,NUM ;gå tillbaka ditt vi var först i MEMORY READOUT: DEC NUM ;minska med 1 BRMI RETURN ;om under 0 avsluta RCALL READ ;här läser den ett tecken INC MEMORY_PLACE ;vi ökar platsen i MEMORY med 1 så att den läser nästa tecken RJMP READOUT RETURN: RETI

Detta är ett skolarbete som jag har suttit fast i en vecka på. Så jag vill veta vad jag gör för fel en att bara få en kod som funkar. MEMORY och MEMORY_PLACE funkar som dem ska.

Det som händer när jag testar koden är att den läser utanför minnet och funkar inte så som jag vill att den ska.

Permalänk
Medlem

Vad heter minnet och vem är tillverkaren?

Permalänk

Det är en Atmel Atmega8 och det inbyggda SRAM. Dem fungerar som de ska då jag nästan har fått den att fungera.

Permalänk
Medlem

När du emulerar (i Atmel Studio, vilket jag antar är vad du menar med 'testar') koden: var gör programmet vad, och vad är det du vill att det ska göra just där?

Visa signatur

Desktop: AMD 3950X, 64 GB RAM, Nvidia 4070 ... (Windows 11)
Serverdesktop: AMD 5600G, 64 GB RAM (Proxmox)
Labbmiljö: Supermicro SC825 X9DRi-F 2xE5-2667v2 64GB RAM
Kamera: Canon R5, Canon RF 100-500, Laowa 100mm f/2.8, Canon RF 24-70 f/2,8

Permalänk
Datavetare

Den här sekvensen ser skum ut

INT2: LDI NUM,0x0A SUB MEMORY,NUM BRMI SUBREADOUT ;om under 0 lägg till 10, annars läs minnet 10 gånger ... SUBREADOUT: SUB MEMORY,NUM ;gå tillbaka ditt vi var först i MEMORY

MEMORY subtraheras två gånger i rad med NUM.

Sedan antar jag att MEMORY, NUM, MAX etc alla är alias för register då AVR verkar vara en load/store-arkitektur (d.v.s. alla aritmetiska instruktioner kan bara jobba med register).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk

LDI NUM,0x0A ;laddar NUM med 10, då det är 10 tecken jag vill läsa.
SUB MEMOTY,NUM ;tar bort 10 och sedan kollar vi om vi är under 0 eller över 50.

SUNREADOUT:
SUB MEMOTY,NUM ;tarbort 10 för att läsa 10 tecken, om jag inte tar SUB så kommer jag att läsa om 10 tecken.

Jag ser dock att jag borde kolla om SUBREADOUT: är under noll då jag tar sub en gång till. Detta är vad det borde hända. (mina grymma paint skills)

Vi börjar på röd prick.
Grönt kryss är det vi har läst
Lila är pekaren som går två steg bak
Blå läser 10 gånger, och då har vi läst blått kryss

Märkte något när jag gjorde paint. Så om jag minskar int2 med 2 gånger istället för en gång och sedan hoppar över minskningen innan läsning så borde jag inte komma på negativ sida.

INT1: LDI NUM,0x0A ;ladda med 10 då vi vill läsa 10 gånger ADD MEMORY,NUM CP MEMORY,MAX ;kollar om vi är över 50 (MAX =50) BRLO SUBREADOUT ;om inte över 50 läs minnet 10 gånger, ta bort 10 innan läsning SUB EEADDR2,NUM ;om över 50 gå till baka där vi var och gå ut ur int1 RETI INT2: LDI NUM,0x0A SUB MEMORY,NUM SUB MEMORY,NUM ;minskar två gånger BRMI READOUT ;om under 0 lägg till 10, annars läs minnet 10 gånger ADD MEMORY,NUM ADD MEMORY,NUM RETI SUBREADOUT: SUB MEMORY,NUM ;gå tillbaka ditt vi var först i MEMORY READOUT: DEC NUM ;minska med 1 BRMI RETURN ;om under 0 avsluta RCALL READ ;här läser den ett tecken INC MEMORY_PLACE ;vi ökar platsen i MEMORY med 1 så att den läser nästa tecken RJMP READOUT RETURN: RETI

Detta borde funka bättre? (har svårt att kolla med hårdvaran nu i helgen)

Edit:
Det är Atmel studio jag kör med, men har hårdvara då Atmel studio suger med interrupts och lite annat.