You are on page 1of 11

1.

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  ARM­a  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 R0­R12 su registri opšte namjene. 
Svi  su  iste  dužine  i  svaki  od  njih može poslužiti za bilo koju operaciju. Svi registri R0­R12 su 
“ravnopravni”  i  svaki  od  njih  može  biti  i  operand  u  instrukciji  i  destinacijski  registar,  tj.  kod 
ARM­a  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). 
 
3­address  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 Pipline­a 
 
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  16­bita  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 
Two­address  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 
 
 
Post­indexing 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 32­bitna instrukcija, gdje se 8­bita koristi za operacioni kôd, a ostalih  
24­bita  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  IRQ­ovi  tako  sto  se  postavi  7­mi  bit  CPSR­a( I bit), i  ako je izuzetak tipa 
FIQ, onemoguce se dalji fast interupti postavljanjem 6­og 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. FIQ­javlja se kada je vanjski pin procesora za FIQ aktivan, tj flag F CPSR­a je clear   
4. IRQ­javlja se kada je vanjski pin procesora za IRQ aktivan, tj flag I CPSR­a 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. Supervisor­SWI­  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 
 
 

You might also like