Kako se definira array u assembleru i popunjuje sa zadatim vrijednostima? Ja sam pokušao ovako:
.DSEG
digit: .Byte 9 ; 7 Segments Digits
I u Reset funkciji nakon initilizacije stack pointera popunjavam array:
; load 7 segments digits into array (&h3f, &h06, &h5b, &h4f, &h66, &h6d, &h7d, &h07, &h7f, &h6f)
ldi xl,byte1(digit)
ldi xh,byte2(digit)
ldi zl,0x3f
st X+,zl
ldi zl,0x06
st X+,zl
ldi zl,0x5b
st X+,zl
ldi zl,0x4f
st X+,zl
ldi zl,0x66
st X+,zl
ldi zl,0x6d
st X+,zl
ldi zl,0x7d
st X+,zl
ldi zl,0x07
st X+,zl
ldi zl,0x7f
st X+,zl
ldi zl,0x6f
st X+,zl
Dakle učitavam array pointer u registre xl i xh (2x8bit), ulitavam vrijednosti segmenta u zl registar i postavljam u SRAM vrijednost jednu za jednom jer RAM nije definirani kao array nego ide vrijednost po vrijednosti...sa X+ zapisujem na sljedecu adresu vrijednost i povecavam pointer(pokazatelj na sljedecu memorijsku lokaciju) na koju ce se zapisati sljedeci podatak iz indirektnog CPU registra zl...dakle sad koristim indirektno adresiranje.
Sad me zanima dali je tako ok i koji je pravilni način? u .DSEG sam definirao 9 bytova u memoriji veličinu arraya koji ce mi sadrzavati brojke od 0 do 9 dakle tocno 9 bytova.
UPDATE:
X Y registri su SRAM lokacije a Z je Program Memory ili ti FLASH lokacija...tako da gornji kod:
ldi zl,byte1(63) ; LOAD - &h3f To Program Memory
st X+,zl ; STORE - &h3f From Program Memory Into SRAM location
Dakle stavljamo &h3f (63dec) vrijednost u programsku memoriju i zatim iz programske memorije kopiramo u SRAM poziciju i incrementiramo SRAM brojač X+....sad me zanima zasto se u ovom primjeru direktno ne upisuje u SRAM? Npr ovako:
ldi yl, LOW(&h3f)
st X+, yl
Tako bi direktno upisali u SRAM vrijednost 3f i samo bi kao u kodu inkrementirali X+ brojac SRAM lokacije da zapisuje array vrijednosti jednu za drugu...time bi kod bio kraci a i vjerujem da je vrijeme citanja iz Flasha 3cycle a SRAM-a 2cycla koliko sam uspio naci info u datasheetu...dakle ovako gubimo 5cycle za upis jedne array brojke iz Flasha u SRAM a ako bi direktno upisivali u SRAM dosli bi na 3cycle sto mi puno logicnije izgleda..pa molim objasnjenje zasto nebi isli direktno upisivat u SRAM?
.DSEG
digit: .Byte 9 ; 7 Segments Digits
I u Reset funkciji nakon initilizacije stack pointera popunjavam array:
; load 7 segments digits into array (&h3f, &h06, &h5b, &h4f, &h66, &h6d, &h7d, &h07, &h7f, &h6f)
ldi xl,byte1(digit)
ldi xh,byte2(digit)
ldi zl,0x3f
st X+,zl
ldi zl,0x06
st X+,zl
ldi zl,0x5b
st X+,zl
ldi zl,0x4f
st X+,zl
ldi zl,0x66
st X+,zl
ldi zl,0x6d
st X+,zl
ldi zl,0x7d
st X+,zl
ldi zl,0x07
st X+,zl
ldi zl,0x7f
st X+,zl
ldi zl,0x6f
st X+,zl
Dakle učitavam array pointer u registre xl i xh (2x8bit), ulitavam vrijednosti segmenta u zl registar i postavljam u SRAM vrijednost jednu za jednom jer RAM nije definirani kao array nego ide vrijednost po vrijednosti...sa X+ zapisujem na sljedecu adresu vrijednost i povecavam pointer(pokazatelj na sljedecu memorijsku lokaciju) na koju ce se zapisati sljedeci podatak iz indirektnog CPU registra zl...dakle sad koristim indirektno adresiranje.
Sad me zanima dali je tako ok i koji je pravilni način? u .DSEG sam definirao 9 bytova u memoriji veličinu arraya koji ce mi sadrzavati brojke od 0 do 9 dakle tocno 9 bytova.
UPDATE:
X Y registri su SRAM lokacije a Z je Program Memory ili ti FLASH lokacija...tako da gornji kod:
ldi zl,byte1(63) ; LOAD - &h3f To Program Memory
st X+,zl ; STORE - &h3f From Program Memory Into SRAM location
Dakle stavljamo &h3f (63dec) vrijednost u programsku memoriju i zatim iz programske memorije kopiramo u SRAM poziciju i incrementiramo SRAM brojač X+....sad me zanima zasto se u ovom primjeru direktno ne upisuje u SRAM? Npr ovako:
ldi yl, LOW(&h3f)
st X+, yl
Tako bi direktno upisali u SRAM vrijednost 3f i samo bi kao u kodu inkrementirali X+ brojac SRAM lokacije da zapisuje array vrijednosti jednu za drugu...time bi kod bio kraci a i vjerujem da je vrijeme citanja iz Flasha 3cycle a SRAM-a 2cycla koliko sam uspio naci info u datasheetu...dakle ovako gubimo 5cycle za upis jedne array brojke iz Flasha u SRAM a ako bi direktno upisivali u SRAM dosli bi na 3cycle sto mi puno logicnije izgleda..pa molim objasnjenje zasto nebi isli direktno upisivat u SRAM?
SAMO-BANOVAN OD 01.11.2024