Professional Documents
Culture Documents
ARM Test1 2015
ARM Test1 2015
Opisati registre ARM procesora
ARM ima 37 registara.
1 namijenjen za programski brojač,
1 za CPSR (current program status register),
5 namijenjenih za SPSR (saved program status registers)
31 registar opšte namjene.
Kod ARMa svi registri su 32 bitne dužine i u njih možemo smjestiti podatke dužine do 32
bita. Ukoliko su podaci duži od 32 bita taj podatak programer mora podijeliti u više registara.
Svi ovi registri nisu vidljivi u svakom operacionom modu, svi operacioni modovi imaju neke
zajednicke registre ali i neke markirane koji su vidljivi samo u tom modu. U User modu
imamo 16 vidljivih registara. Od toga registri označeni sa R0R12 su registri opšte namjene.
Svi su iste dužine i svaki od njih može poslužiti za bilo koju operaciju. Svi registri R0R12 su
“ravnopravni” i svaki od njih može biti i operand u instrukciji i destinacijski registar, tj. kod
ARMa ne postoje tzv registri akumulatori koji služe samo da bismo spremili rezultate
operacija. U user modu postoje 3 registra sa posebmnim funkcijama.
R13 Stack pointer (SP) je registar koji u svakom trenutku ima pokazivač (adresu) na stack
memoriju. U zavisnosti od vrste stack memorije on pokazuje na zadnju zauzetu lokaciju ili
prvu praznu i njegove adrese rastu ili opadaju u zavisnosti da li je stack rastući ili opadajući.
R14 Link register (LR) čuva adresu instrukcije na koju će se PC vratiti nakon poziva
podprograma.
R15 Program counter (PC) u toku izvršavanja naredbe dio vremena sadrži adresu naredbe
koja se izvšava a drugi dio vremena sadrži adresu naredne instrukcije koja se treba izvršiti.
2. Operacioni modovi ARM procesora
ARM procesori imaju 7 operacionih modova od čega jedan korisnički i 6 privilegovanih
Korisnicki:
● User
Privilegovani:
● System
● FIQ
● IRQ
● Abort
● Undefined
● Supervisor
FIQ, IRQ, Abort, Undefinded, Supervisor su modovi za tretiranje izutetaka (exception
modes)
Korisnicki User mod
U ovom modu je dozvoljeno pisanje korisnickih programa ograničen pristup memoriji i
sistemski resursi su nedostupni iz ovog moda. Izlazak i promjena moda iz User moda u neki
drugi moguća je samo dolaskom nekog izuzetka
Privilegovani modovi
Dozvoljen pristup sistemskim resursima, moguće potpuno pristupanje memoriji cijelog
sistema i iz ovih privilegovanih modova moguće se “prebacivati” u druge modove slobodno.
Svaki od privilegovanih modova ima svoj prioritet i tacnu adresu u vektor tabeli tj. u vektor
tabeli se nalazi adresa pocetka tog privilegovanog moda tako da procesor u dva skoka moze
uci u neki privilegovani mod zavisno od izuzetka koji se pojavio.
3. Osnovni i modifikovani format ARM asemblerske funkcije. Navedite nekoliko (do
5) ARM asemblerskih instrukcija za obradu podataka, za prenos podataka i za
kontrolu toka programa
Postoje dva seta asemblerskih insturkcija
ARM standardne instrukcije duzine 32 bita. Koriste Load/Store ahitekturu. To znaci da sve
operacije koje se izvrsavaju, izvrsavaju se na nivou registara. Svi podaci koji treba da se
obrade moraju biti “spušteni” (učitani) u registe pa tek nakon toga se izvrsvaju operacije.
Ovakva arhitektura doprinosi brzini obrade podataka jer registri su najbrza memorija, dok
sve ostale memorije spadaju u periferne uredjaje koji rade na manjim brzinama od procesora
te moze doci do kasnjenja u obradi podataka (proces gubi vrijeme cekajuci podatke).
3address data procesing instruction. Obično sve ARM instrunkcije koriste tri parametra pa
je generalni oblik arm instrukcije:
instrukcija, destinacijski registar, registar sa podatkom, operand2.
npr: ADD Rd,Rn,Op2
Destinacijaski registar i registar sa podatkom obavezno moraju biti registri dok operand2
moze biti registar ili konstanta.(nije moguce da bude neka druga memorijska lokacija npr
adresa na steku). Takodjer u ovom slucaju se u registar moze upisati samo vrijednost od 0
do 255 tj. hexadecimalno od 0x0 do 0xff
primjri
ADD R0,R1,R2 // R0 = R1+R2
ADD R0,R1,#5 // R0=R1+5
Moguć je takodje i skraceni zapis instrukcija tip:
ADD R1,R2 // R1 = R1+R2
ADD R1,#5 //R1=R1+5
Uslovne instrukcija svaka od instrukcija se moze napraviti da bude uslovna kombinovanjem
mnemonika vise instrukcija npr BEQ naredba koja izvrsava skok u zavisnosti od nekog
uslova. Mogućnost kreiranja kondicionih (uslovnih) naredbi okogućuje održavanje Piplinea
Mogucnost Load/Store operacija za vise registara (LDMR/STRM)
Operacija pomijeranja i ALU operacije moguće unutar jednog ciklusa.
Thumb instrukcijski set
Instrukcije su širine 16bita koje budu expandirane u ARM instukcije i nakon toga izvrsene.
Imaju losije performanse od ARM instrukcija (ARM 40% brzi). Veća gustića koda za razliku
od ARM instrukcija (Thumb zauzama 30% manje prostora)[ne moš dobit i na mostu i na
ćupriji :P] Postoji mogućnost kombinovanog korištenja ARM i Thumb instukcija tzv.
“interworking”. Kompajler podrzava kombinovano koristenje ARM i Thumb instrukcija.
Thumb je više tradicionalan instrukcijski set, nema uslovnih naredbi. Također koristi
Twoaddress data processing instructions (ja ovo mogu samo bukvalno prevest “za obradu
podataka koristi instukcije sa dva parametra”). Nije moguće promijeniti CPSR pomoću
Thumb instrukcijskog seta. Maksimalno 255 sistemskih poziva.
Instukcije:
LDR Load Word ucitava jednu rijec u registar 4 bajta podataka
STR Store Word sprema jednu rijec, 4 bajta podataka
ADD sabiranje
ADDS sabiranje sa update zastavica
SUB oduzimanje
SUBS oduzimanje sa update zastavica
MOV premjesti nesto u registar
CMP compare
MUL mnozenje
B branch bezuslovni skok, B labela
BL branch with link
BNE uslovna naredba pogodna za kontrolu toga programa Branch if Not Equal
BHI Branch if Higher
4. Napisati asemblerski program za realizaciju skalarnog proizvoda dva vektora (prvi
vektor počinje na adresi vektor1, drugi na adresi vektor2 i dužina vektora je 30)
C ( ovo je prof na pola ispita, kao ispisao na tabli):
int vektor1[30];
int vektor2[30];
int skalar;
int i;
skalar = 0;
for(i = 0; i < 30; i++)
{
skalar = skalar + vektor1[i] * vektor2[i];
}
UPDATE!!! bila mala greskica pa sam ispravio
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors
DCD 0x20001000
DCD Reset_Handler
ALIGN
;ovo iznad se ne pise na ispitu
AREA PODACI, DATA, READONLY
vektor1 DCD 1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10
vektor2 DCD 10,9,8,7,6,5,4,3,2,1,10,9,8,7,6,5,4,3,2,1,10,9,8,7,6,5,4,3,2,1
AREA ISPITNI, CODE, READONLY
ENTRY
EXPORT Reset_Handler ; ni ovo ne ide na ispitu
Reset_Handler ;niti ovo ne ide na ispitu
LDR R0, =vektor1 ;u R0 smejstamo adresu od vektor1
LDR R1, =vektor2 ;u R1 smjestamo adresu od vektor2
MOV R2,#30 ; R2 ce posluziti kao brojac unazad smejstamo u njega 30 kako bismo
imali 30 ponavljanja for petlje
MOV R5,#0 ; R5=0
FOR LDR R3,[R0] ; u R3 smjestamo vrijednost trenutnog elementa niza u C++ bi bilo
vrijednost = vektor1[i]
LDR R4,[R1] ; R4 sadrzi trenutni element od vektor2
MLA R5,R3,R4,R5 ; ovo je ekvivalentno R5 = R3* R4 + R5 od profesora skalar =
skalar + vektor1[i] * vektor2[i]
ADD R0,#4 ; adresu vektor1 pomjeramo za 4 bajta ekvivaledno tj idemo na sledeci
element niza
ADD R1,#4 ;ista stvar sa vektor2 idemo na sledeci element niza
SUBS R2,#1 ; umanjujemo brojac za 1
BNE FOR
KRAJ B KRAJ
;Sadrzaj registra R5 je skalarni proizvod :D
END
Postindexing ako hoces da se pravis pametan isto radi kao i na slici iznad
5. ARM realizacija poziva podprograma, povratka podprograma, te način prenosa
podataka u/iz podprograma
U ARM arhitekturi nacin poziva podprograma se odvija koristenjem BL(Branch and Link)
instrukcije. Da bi koristili BL instrukciju potrebno je da je R14(LR) slobodan, jer se u njega
smjesta adresa naredne instrukcije koja se izvrsava nakon izvrsenja podprograma. Kao i sve
ostale instrukcije i BL je 32bitna instrukcija, gdje se 8bita koristi za operacioni kôd, a ostalih
24bita se koristit za adresu podprograma. Iz ovog razloga BL moze pozivati subrutinu
smjestenu bilo gdje u 32 MB adresnog prostora. Da bi znali gdje se program treba vratiti
nakon izvrsavanja subrutine, ARM automatski cuva adresu naredne naredbe poslije BL u
R14(LR). Kada se poziva subrutina i procesor sacuva PC u LR, pocinje da fetchuje
instrukcije sa nove lokacije. Nakon izvrsavanja subrutine moramo korstiti naredbu BX LR ili
MOV PC,LR da bi vratili kontrolu calleru tj. nastavili sa izvrsavanjem prekinutog programa.
Svaka subrutina/podprogram mora imati BX LR(MOV PC,LR) kao zadnju instrukciju.
Takodjer imamo slucajeve kada pozivivamo podprogam u podprogramu(nested
call/ugnjezdeni poziv). Da bi to mogli uciniti moramo koristiti stack jer ARM CPU podrzava
samo jedan poziv u jednom trenutku (imamo samo jedan LR)
Tri su nacina prenosa podataka u/iz podprograma:
1. Preko registara ujedno i najbrzi nacin
2. preko pokazivaca na blokove po referenci na neki niz
3. preko steka ovaj tip je za prenos podataka tipa strukture
6. Napisati asemblerski program (dravjer, program i podprogram) za nalaženje
dužine null terminalnog stringa
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors
DCD 0x20001000
DCD Reset_Handler
ALIGN
;sve ovo iznad ne pisat na ispitu
AREA RECENICA, DATA, READONLY
RIJEC DCB "Radi",0 ; deklaracija nekog stringa
AREA VARIJABLA, DATA, READWRITE
BROJAC DCD 0 ; deklaracija neke varijable u koju cemo smjestiti rezultat
AREA ISPITNI, CODE, READONLY ;ove AREA linije obavezno pisati na ispitu
ENTRY
EXPORT Reset_Handler ;ovu liniju ne pisat na isitu
Reset_Handler ; i ova se ne pise na ispitu
LDR R0, =RIJEC ; u registar R0 smjestamo adresu od varijable RIJEC
MOV R2,#0 ; R2=0
MOV R3,#0 ; R3=0
FOR LDRB R1,[R0],#1 ; ovdje ima svasta u R1 smjestamo vrijednost na adresi R0
;u prvoj iteracij to ce biti prvo slovo u sledecej drugo sve dok ne dodje do kraja, ovo ,#1 znaci
;pomjeri se za jedan bajt memorje a posto jedno slovo zauzima jedan bajt znaci pomjeri se
na sedece slovo
CMP R1,R2 ; provjerava da li R1 == R2, R2 =0 to znaci provjerava da li je slovo
; jednako 0, a u deklaraciji RIJEC DCB "Radi",0 ovo ,0 smo morali napisat kako bismo string
; terminirali sa null karakterom, "mora tako i na ovom i na onom svijetu"
ADDNE R3,#1 ; Uveca R3 za jedan ako nisu jednaki, to znaci da nismo dosli do
kraja stringa i
;poveca broj slova ja 1
BNE FOR ;"skace" na labelu FOR ako u CMP R1,R2 tj ako R1 nije jednako R2,
;tj ako nismo dosli do kraja
LDR R4,=BROJAC ; u registar R4 upisujemo adres varijable BROJAC
STR R3,[R4] ; e sad na aresu koja je spremjljena u R4 upisujemo ono sto se
;nalazi unutar registra R3 tj u varijablu BROJAC upisujemo koliko karaktera ima rijec
KRAJ B KRAJ
END
7. Pojam, vrste i način obrade izuzetaka kod ARM procesora sa posebnim osvrtom
na SWI instrukciju
Izuzetci se najcesce koriste za obradu neocekivanihih eventa koji nastaju tokom izvrsetka
nekog programa, kao sto su interupti ili greske memorije, kao i softwarske interupte,
nedefinisane instrukcije i system reset. Imamo 3 vrste izuzetaka :
1. izuzetci nastali kao direktna posljedica izvrsetka neke instrukcije (softwerski interupti,
undefined interupti i prefetch abort)
2. izuzetci nastali kao “sporedni efekat” izvrsetka neke instrukcije(data abort)
3. izuzetci nastali kao rezultat spoljasnjih eventa(reset, fiq, irq)
Kada dodje do izuzetka ARM zavrsava trenutnu instrukciju na najbolji moguci nacin(osim
ako je u pitanju reset onda se automatski terminira trenutna instrukcija) i prelazi na obradu
izuzetka koji pocinje na nekoj adresi(vektor tabela). Izuzetak se obradjuje na sljedeci nacin:
● promjeni se operacioni mod iz trenutnog u mod izuzetka
● sacuva se adresa naredne instrukcije koja ce se izvrsiti nakon sto se obradi dati
izuzetak u LR
● sacuva se vrijednost CPSR u SPSR
● disableju se IRQovi tako sto se postavi 7mi bit CPSRa( I bit), i ako je izuzetak tipa
FIQ, onemoguce se dalji fast interupti postavljanjem 6og bita CPSR (bit F)
Nakon sto se obradi dati izuzetak user mod se dalje nastavlja na onom mjestu gdje se desio
prekid. Postupak je sljedeci:
● Bilo koji modifikovani registar se mora vratiti sa steka
● CPSR se vraca iz SPSR
● PC se mora upunit sa vrijednosti sljedece instrukcije tj. iz LR
Posljednje dvije instrukcije se odvijaju automatski kao dio jedne instrukcije. Exeption Handler
koristi r13 _<mode> koji se normalno inicijalizira da pokazuje na odredjenu adresu na steku,
tako da bi se mogli sacuvati user registri.
Prioriteti izuzetaka :
1. Reset(najveci prioritet) javlja se kada reset pin procesora aktiviran, ovaj izuzetak se
javlja prilikom pokretanja procesora ili resetovanja procesora na stanje u kojem se
nasao prilikom pokretanja.
2. Data abort javlja se kada data transfer instrukcija pokusava da load ili store podatke
na memorijsku lokaciju koja nije validna
3. FIQjavlja se kada je vanjski pin procesora za FIQ aktivan, tj flag F CPSRa je clear
4. IRQjavlja se kada je vanjski pin procesora za IRQ aktivan, tj flag I CPSRa je clear
5. Prefetch abort javlja se u slucaju kada procesor izvrsava naredbu koja nije
fetchovana jer je adresa nije bila validna( pipeline)
6. Undefined javlja se u slucaju kada niti procesor niti koprocesori ne prepoznaju
trenutnu instrukciju
7. SupervisorSWI korisnicki definiran interupt, dozvoljava user modu da trazi
privilegovane operacije, one koje se izvrsavaju u Supervisor modu
8. Konverzija malih slova u velika
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors
DCD 0x20001000 ; stack pointer value when stack is empty
DCD Reset_Handler ; reset vector
ALIGN
area podaci,data,readonly
rijec dcb "AbbaaC",0
rijec2 dcb 0
AREA instrukcije, CODE
ENTRY
EXPORT Reset_Handler
Reset_Handler
main
ldr r0,=rijec
mov r3,#0x61 ;malo a
mov r4,#0x7A ;malo z
mov r10,#0 ;kraj stringa
ldr r11,=rijec2 ;lokacija izmjenjenih slova, mada i ne mora
loop1
ldrb r2,[r0],#1
cmp r2,r3
bge loop2 ;ako je u pitanju malo slovo a pa nadalje
cmp r2,r10
beq here
strb r2,[r11],#1;store izmjenjenog stringa,
b loop1
loop2
cmp r2,r4
ble loop3 ;ako je u pitanju malo slovo izmjedju a i z
cmp r2,r10
b here
b loop1
loop3
sub r5,r2,#20 ; konverzija malog u veliko slovo
strb r5,[r11],#1 ;store izmjenjenog stringa
b loop1
here b here
end
9. Dijeljenje
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors
DCD 0x20001000 ; stack pointer value when stack is empty
DCD Reset_Handler ; reset vector
ALIGN
AREA instrukcije, CODE
ENTRY
EXPORT Reset_Handler
Reset_Handler
main
mov r0,#200 ;brojnik
mov r1,#10 ;nazivnik
mov r2,#0 ;rezultat dijeljenja
for
add r2,#1
subs r0,r0,r1
bne for
here b here
end