[AVR] Assembler problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

[AVR] Assembler problem

Inlägg av Korken »

Godagens!

Jag har åter igen börjar med assembler för AVR sedan jag har läst en kurs i MIPS assembler.
I den kursen hade vi en jätte bra namnlista för register som jag tänkte köra med på AVRen också, men det fungerar inte för någon anledning.

Kod: Markera allt

.def v0	= r2	;Expression evaluation and results of function
.def v1	= r3	;Expression evaluation and results of function
.def a0	= r4	;Argument 1
.def a1	= r5	;Argument 2
.def a2	= r6	;Argument 3
.def a3	= r7	;Argument 4
.def t0	= r8	;Temporary (not preserved across calls)
.def t1	= r9	;Temporary (not preserved across calls)
.def t2	= r10	;Temporary (not preserved across calls)
.def t3	= r11	;Temporary (not preserved across calls)
.def t4	= r12	;Temporary (not preserved across calls)
.def t5	= r13	;Temporary (not preserved across calls)
.def t6	= r14	;Temporary (not preserved across calls)
.def t7	= r15	;Temporary (not preserved across calls)
.def t8	= r16	;Temporary (not preserved across calls)
.def t9	= r17	;Temporary (not preserved across calls)
.def s0	= r18	;Saved temporary (preserved across calls)
.def s1	= r19	;Saved temporary (preserved across calls)
.def s2	= r20	;Saved temporary (preserved across calls)
.def s3	= r21	;Saved temporary (preserved across calls)
.def s4	= r22	;Saved temporary (preserved across calls)
.def s5	= r23	;Saved temporary (preserved across calls)
.def s6	= r24	;Saved temporary (preserved across calls)
.def s7	= r25	;Saved temporary (preserved across calls)
Jag får bara en error: "C:\Arbetes grejer\AVR Projects\AVR 8-bit\KS0108_driver_asm\KS0108_driver_asm.asm(85): error: Invalid register" när jag använder register t0, t1 och t2.
Vet någon varför jag får detta?
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: [AVR] Assembler problem

Inlägg av Swech »

Alltså..
Varför är a0 lättare att komma ihåg iställlet för r4?
eller s0...eller....

Jag döper aldrig om mina register, förrutom x,y,z som är definierade.
Kör istället med att varje rutin fritt använder registren.
Data som skall sparas sparar man i RAM inte i register.

Liten modifikation är att jag ALLTID definierar 3 st register.
R2-R4
R2 = spara status vid interrupt
R3 = ALLTID satt till 0 och döpt till S_ZERO
R4 = ALLTID satt till -1 och döpt till S_VOID.

Varför detta då?
Jo då man kör med indexregistren x,y,z så behöver man ofta indexera
sig med ett 8 bitars värde.
t.ex. hämta från ramtabell på position 0-255

Kod: Markera allt

   LDI   XL,LOW(RAM_TAB)  ;X:=RAM TAB
   LDI   XH,HIGH(RAM_TAB)

   LDS  R16,MY_POS      ;HÄMTA INDEX
   LDI   R17,0               ;INDEX ENDAST 0-255
   ADD  XL,R16             ;ADDERA INDEX 0-255
   ADC  XH,R17             ;ADDERA MED 0 OCH CARRY)
addera 0 med carry måste man göra eftersom ramtabellen kan ligga på
en 256 byte gräns i minnet. (förutsatt att AVR processorn har mer än 256byte ram)

Kod: Markera allt

   LDI   XL,LOW(RAM_TAB)  ;X:=RAM TAB
   LDI   XH,HIGH(RAM_TAB)

   LDS  R16,MY_POS      ;HÄMTA INDEX
   ADD  XL,R16             ;ADDERA INDEX 0-255
   ADC  XH,S_ZERO        ;ADDERA MED 0 OCH CARRY)
Har man ett register man VET alltid är 0 så behöver man inte ladda upp
ytterligare ett vid varje 16 bit indexering

Swech
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [AVR] Assembler problem

Inlägg av sodjan »

> ...error: Invalid register" .

När får du det ? I vilken instruktion ? D.v.s, hur ser rad 85 ut ?
Det är lite märkligt att du inte har med rad 85 från början...

Och om du byter ut "t0", "t1" och "t2" mot "r8", "r9" resp "r10" så
försvinner alltså felet ? För det har du väl testat, eller hur ?

> Vet någon varför jag får detta?

Sorry, kristallkulan har slut på batterier just nu...

Och vad har MISP assembler med en AVR att göra ?
Varför skulle den uppdelning av register i en MIPS vara optimalt för en AVR ?
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: [AVR] Assembler problem

Inlägg av Korken »

Swech:
När det gäller namngivning av register så gillade jag det för att det är nu en vana. Därför jag vill ha det igen.
Men ska sluta med det efter jag har fått bättre koll på asm för AVR.

sodjan:
Några exempel på rader som inte fungerar är:

Kod: Markera allt

ldi t0, low(RAMEND)
subi t0, 64
ldi a0, 0b01001001
Uppdelningen är antagligen inte optimal, men jag är van med det, så vill hålla i det tills jag har bättre kolla på asm för AVR också.

"Och om du byter ut "t0", "t1" och "t2" mot "r8", "r9" resp "r10" så
försvinner alltså felet ? För det har du väl testat, eller hur ?"
Japp, det har jag testat och felet stog fortfarande kvar.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: [AVR] Assembler problem

Inlägg av Korken »

Ursäkta mig. Jag måste ha ätit något dåligt och glömt att man inte kan använda ldi och liknande instruktioner med R0 - R15... Bara R16+.
Tack för tiden iaf! :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [AVR] Assembler problem

Inlägg av sodjan »

EDIT:
Ser nu ditt senaste inlägg. Men jag hade detta redan färdigskrivet
så jag skickade in det i alla fall...


> ldi t0

Läs på om LDI.
Sidan 94 i http://www.atmel.com/dyn/resources/prod ... oc0856.pdf
Du bör nog läsa på lite om AVR arkitekturen, speciellt om begränsningar i hur vissa
instruktioner (t.ex LDI) är begränsade till vissa grupper av register (t.ex r16-r31 för LDI).

>>> "Och om du byter ut "t0", "t1" och "t2" mot "r8", "r9" resp "r10" så
>>> försvinner alltså felet ? För det har du väl testat, eller hur ?"

> Japp, det har jag testat och felet stog fortfarande kvar.

OK, då är jag inte alls med här...
Vad har dina definitioner ("t0" o.s.v.) med själva felet att göra ???
Varför fokuserade du på det alls ? Din fråga var ju varför dina egna
definitioner inte fungerade, men problemet har ju inte ett smack med det
att göra, vilket du ju tydligen redan visste ? Så varför inte bara fråga
varför LDI inte fungerar mot t.ex r8 ?

> När det gäller namngivning av register så gillade jag det för att det är nu en vana.

Igen, vad har MIPS med AVR programmering att göra ?
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: [AVR] Assembler problem

Inlägg av Korken »

"OK, då är jag inte alls med här...
Vad har dina definitioner ("t0" o.s.v.) med själva felet att göra ???"
Det har du rätt i. Tänkte lite snett där :oops:

"> När det gäller namngivning av register så gillade jag det för att det är nu en vana.
Igen, vad har MIPS med AVR programmering att göra ?"
Som jag sa i mitt förra inlägg: "Uppdelningen är antagligen inte optimal, men jag är van med det, så vill hålla i det tills jag har bättre kolla på asm för AVR också."
Jag gör det för att det är en vana. Men AVR har inget med MIPS att göra, men det är enkelt att hålla i en vana när man lär sig. Då kan jag fokusera på koden och inte sitta och jaga bland mina register vilket jag tycker stör mitt tänkande och arbetsflöde.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [AVR] Assembler problem

Inlägg av sodjan »

Jo, min min poäng är att din "vana" fick dej att köra rakt in i väggen.
Jag ser inte att denna "vana" ger dig någon fördel.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: [AVR] Assembler problem

Inlägg av Korken »

sodjan: Det har du helt rätt i. :) Men jag vill först och främst bara komma in i tänket, sen kan jag skrota det gamla systemet.
Men, som du sa, MIPS har inget med AVR att göra så ska inte hålla i det.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: [AVR] Assembler problem

Inlägg av jesse »

Om du kommer in i det nya tänket direkt från början så blir det lättare i längden och du behöver inte tänka om igen. Som du gör nu så får du ju ändra "vanor" två gånger - först när du byter till AVR och sedan när du ska försöka anpassa dig till AVR. Så mitt välmenande råd är att du tänker 100% AVR redan från start. Å andra sidan behöver dina definitioner inte vara helt fel - om de bara är anpassade för AVR så kan de mycket väl tjäna ett syfte. Jag har gjort liknande definitioner som du i AVR-assembler - jag döper gärna registren till en massa saker.

r16,r17 och r18 brukar jag kalla för tmp, tmp1 och tmp2.
Sedan har jag ett antal register som heter AL, AH, BL, BH, CL CH och DL, DH för beräkningar med 16-bitars tal.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: [AVR] Assembler problem

Inlägg av Korken »

Jo, jag förstår vad du menar. :)
jag har redan börjat komma in i det så har tagit bort mina definitioner och arbetar vidare utan dom.
Tack för tipsen allihopa!
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: [AVR] Assembler problem

Inlägg av Korken »

jag har dock en liten fråga till. Känns onödigt att starta en ny tråd om det.
Hur gör man så ett kommando kan vara flera rader långt?
Jag har en massa data (teckentabeller) jag lägger in med .db, men får syntax error för att jag har den över flera rader.
Hur gör man i assembler för att berätta för kompilatorn att kommandot fortsätter på nästa rad?

Kod: Markera allt

.db 0b01111110, 0b10010000, 0b10010000, 0b10010000, 0b01111110, ;A
	0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b01101100, ;B
	0b01111100, 0b10000010, 0b10000010, 0b10000010, 0b01000100, ;C
	0b11111110, 0b10000010, 0b10000010, 0b01000100, 0b00111000, ;D
	0b11111110, 0b10010010, 0b10010010, 0b10010010, 0b10000010, ;E
	0b11111110, 0b10010000, 0b10010000, 0b10010000, 0b10000000, ;F
	0b01111100, 0b10000010, 0b10010010, 0b10010010, 0b01011100, ;G
	0b11111110, 0b00010000, 0b00010000, 0b00010000, 0b11111110, ;H
	0b10000010, 0b11111110, 0b10000010, 0, 0,                   ;I
	0b00001100, 0b00000010, 0b00000010, 0b00000010, 0b11111100, ;J
	0b11111110, 0b00010000, 0b00101000, 0b01000100, 0b10000010, ;K
	0b11111110, 0b00000010, 0b00000010, 0b00000010, 0b00000010, ;L
	0b11111110, 0b01000000, 0b00100000, 0b01000000, 0b11111110, ;M
	0b11111110, 0b01000000, 0b00111000, 0b00000100, 0b11111110, ;N
	0b01111100, 0b10000010, 0b10000010, 0b10000010, 0b01111100, ;O
	0b11111110, 0b10010000, 0b10010000, 0b10010000, 0b01100000, ;P
	0b01111000, 0b10000100, 0b10000100, 0b10000110, 0b01111010, ;Q
	0b11111110, 0b10010000, 0b10011000, 0b10010100, 0b01100010, ;R
	0b01100100, 0b10010010, 0b10010010, 0b10010010, 0b01001100, ;S
	0b10000000, 0b10000000, 0b11111110, 0b10000000, 0b10000000, ;T
	0b11111100, 0b00000010, 0b00000010, 0b00000010, 0b11111100, ;U
	0b11100000, 0b00011100, 0b00000010, 0b00011100, 0b11100000, ;V
	0b01111100, 0b00000010, 0b00011100, 0b00000010, 0b01111100, ;W
	0b10000010, 0b01101100, 0b00010000, 0b01101100, 0b10000010, ;X
	0b11100000, 0b00010000, 0b00011110, 0b00010000, 0b11100000, ;Y
	0b10000110, 0b10001010, 0b10010010, 0b10100010, 0b11000010  ;Z
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [AVR] Assembler problem

Inlägg av sodjan »

Är det inte bara att skriva .db på varje rad ?
Hamnar de inte i följd i minnet ?

Dessutom har du säkert sett att AVR assembler manualen
säger "Code lines should be limited to 120 characters.", eller hur ?
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: [AVR] Assembler problem

Inlägg av Korken »

Om jag har .db på varje rad så behöver jag omorganisera allt mitt data så det ligger i jämna par.
Och jag har väldigt mycket data, så skulle helst vilja slippa det. :)

Det har jag inte sätt, tack för tipset! :)
Ska då dela mina tabeller på mitten, då de är ~130 byte stora var.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: [AVR] Assembler problem

Inlägg av sodjan »

> Ska då dela mina tabeller på mitten, då de är ~130 byte stora var.

Vad menar du ?
Vad har det med radlängden i AVR assembler att göra ?
Skriv svar