Vous êtes sur la page 1sur 19

ARM STM32f4-discovery Board Kullanm 1

STM32f4-discovery Board Kullanm 1


Blok_Diyagram

Kartn genel olarak kullanm ile ilgili detayl bilgileri internet zerinden bulabilirsiniz. Bende sizlere yeni rendiim bilgileri proje dosyas olarak sunmak istiyorum. Gnmzde ARM gittike yaygnlaan bir mikrodenetleyicidir. Bu tip boardlar ile projelerimizin ierisinede girmeyi baarmtr.

ARM (Advanced RISC Machines)


Gml sistemlere ilgi duyan herkes son zamanlarda iki terimin ismini bolca duymaya balad. Bunlar ARM ve Gml Linuxdur. Artk herkes bu alanlara ynelme almalarna girdi. zgr ortamda kod yazmak, masraf milyonlarca liray bulan yazlm lisanslarndan kurtulmann vermi olduu rahatlkla birleince gml linux son zamanlarda populerliini arttrd. Bizim bu konumuzda deineceimiz ARM konusu ise kukusuz dnyada ve Trkiyede ok popler bir yer igal etmektedir. Belki de bir sonra ki diyeceimiz cmleyi bir ok defa duymu olacaksnz. Gml Sistemlerle yaplan projelerin byk bir ounluunda ARM temelli ilemciler kullanlmakdr. Evet, evet tahmin edebiliyorum bunu ok duydunuz ki ARM ilemcileri renmeye karar verdiniz. ARM renmek isteyen birok kii olmasna ramen arm renmek iin pek fazla dkman ve kaynak bulunmamaktadr. Bizde bu durumda kod ARM temellerine giri yapalm dedik. Burada vakit bulduka ARM ilemcilerinin mantn, alma prensibi gibi temel aklayc bilgileri dilimizin dndnce aklamaya alacam. Bunlar aklarken tabiki hata yapacaz, bazen eksik bilgi verebileceiz vs. Ltfen bunlar iin sitede benimle iletiime geerek hatal grdnz yerleri dzeltme imkan salarsanz ok sevinirim. lk aklamalarmz yaptktan sonra artk yava yava konumuza geelim. ARM Nedir ? ARM uzun ad Advanced RISC Machines olan bir ilemci mimarisidir. Mimari 32bitlik olmasnn yannda dk maliyeti ile gnmzde ok tutulan ilemci ekirdeklerinin ortaya kmasna neden olmutur. ARM rettii ekirdekleri eitli firmalara lisanslandrarak bu firmalarn deiik uygulamalar yapmasna olanak salamaktadr. Yani ARM firmas tmleik devre retimi gerekletirmemektedir. Bunun yerine Samsung, Hp, Altera, Micronas, Mitsubishi, Motorola, Sanyo, Triscend gibi birok firma ARM ekirdeklerini alp bunun zerine uygulmalarn gelitirmekte veya ARM tabanl kendi ilemcilerini piyasaya srmektedir. Baya uzun srecek yaz dizimizde ARM komutlarna deineceiz. Sitede ARM ile c programlama rnekleri baka konularda yer alabilir ancak biz konularmz ARM komut seti ile devam ettireceiz. nk bir mikroilemciyi tanmak iin bence onun komut setini, registerlarn renmekle mmkn olur. Zaten c programlama bildikten sonra bu bilgilerinizi daha efektif bir ekilde kullanabilirsiniz. Temel olarak ARM komut setleri 2 alt ksma ayrlr bunlar 16 bitlik THUMB ve 32 bitlik ARM komut setleridir. Biz ncelikle 32 bitlik komut setlerine deineceiz.

ARM zellikleri ARM tam olarak olmasa da RISC snf bir ilemcidir. (Reduced Instruction Set Computer) yani komut seti azaltlm bir ilemcidir. Neden tam olarak RISC ilemci olmadn aklayalm. ncelikle R1 den R16ya kadar 32 bitlik registerlara sahiptir ayrca btn komut setlerini conditional yani durumsal olarak kontrol edebiliriz ve son olarak 32bitlik barrel shiftera sahiptir bu da bilindii zere combinational bir devredir yani saat sinyalinden bamsz olarak bir saat darbesinde birka ilem yapmaya olanak salar. Saydmz tm bu zellikler ARM ilemcileri tam olarak RISC snf bir mikroilemci yapmaz. ARM toplamda 6 tane ilem moduna sahiptir ve 37 tane register yani yazmadan olumaktadr. Bu yazclarda 31 tanesi 32bitlik genel amal yazmalar, 6 tanesi durum yazmalar ve R0dan R14e kadar 15 adet programc tarafndan programlanabilen yazmalara sahiptir. Genel olarak little endian sisteme sahip olmakla birlikte istenirse big endian olarak da ayarlanabilir. Burada Little Endian ve Big Endiannn tam olarak trkelerini bilemediimden dolay trkelerini yazmyorum J. Litlle endian gsterim format bildiiniz zere en dk adresli konumda yazma iindeki en dk deerli (least significant bit) bit tutulur.

ARM 1
lk yazmzn ardndan, ikinci yazmz ile ARMa devam ediyoruz. Bu yazmzda ARM mimarisine daha ayrntl bir ekilde deineceiz. lk olarak ARM mimarisinin ok basit bir gsterimini yapalm.

Yukardaki ekilden de grlebilecei zere register file olarak adlandrlan yazmalardan alnan deerler ALU yardmyla ileme tutularak sonu tekrar yazmalara yazlr. Burada dikkat edilmesi gereken ikinci operandn barrel shifter vastasyla ALUya alnddr. Yine MAC yani multiply accumulate trke sylemek gerkirse arpma ve toplama nitesi 32 bitlik yazmalardan verileri alr ve sonucu registera yazar. Load / Store komutlar ise adresi oluturmak iin ALUyu kullanrlar. Bylece temel olarak ekirdein ok basit bir ekilde ne yaptn renmi olduk imdi register yani yazmalara giri yapalm. REGISTER Registerlar ilk yazmzda da deindiimiz gibi 32 bit uzunluundadr. Registern ksaltmas olan R harfi ile adlandrlrlar R0 dan R14e kadar kullancnn kullanabildii yazma vardr. Bunlara aktif yazma ad verilir. Aadaki ekilde yazmalar gsterilmitir. Toplamda durum yazmalarnn eklenmesi ile 18 aktif yazma bulunmaktadr.

Yukarda ekilden de anlalaca zere r13,r14 ve r15 yazmalarnn zel grevleri bulunmaktadr. Bunlar; R13 : Stack Pointer olarak grev yapar. Verinin stack iine alnmas ile stackin current processor modunda ban tutar. R14 : Link Registerdr. Altprogram arldnda dn adresini tutar. R15 : Program Counter. lemci tarafndan fetch edilecek bir sonraki komutun adresini tutar. R13 ve r14 istenildii takdirde genel kullanm amac ile kullanlabilir ancak bu pek tavsiye edilen bir ilem deildir nk genelde iletim sistemleri nceden belirtilen grevleri yapmak zere ilemcinin bu blmlerini kullanmaktadr. Yukarda aklanan yazmalara ilave olarak durum deikenlerini tutan iki tane yazma bulunmaktadr. Bunlar ; Current Program Status Register Saved Program Status Register

Adnda anlalabilecei gibi bu yazmalar registerlar zerinde yaplan ilemlerden sonra sonuca gre deien bitleri barndrmaktadr. Durum register bitleri aada gzkmektedir.

Burada N,Z,C,V,Q gibi bitler yaplan ilemlerde sonra sonucun zero yani sfr, negatif olup olmamasna elde bitinin varlna overflow yani tama olup olmadna veya saturation olup olmadna gre deiirler. Bata yer alan I,Fve mode bitleri ise IRQ ve FIQ kesmelerini maskelemek iin kullanlr. Mode blm ise birazdan deineceimiz ilemci modunu belirler. T biti ise THUMB komut setini aktifletirmek iin kullanlr. Yani 16 bitlik Thumb komut setini kullanmak istiyorsal bu biti 1 yapmalyz. Eer 32 bitlik komut setini kullanmak istiyorsak bu bit 0 olmaldr.

lemci Modlar Bir nceki yazmzda da belirttiimiz zere toplamda 37 yazmacmz vardr ve bunlar ekil 1 de gsterilmiti. Programc bunlarn 17 tanesi ile iletiim kurabiliyordu. Geri kalan 20 yazma ise ilemci modlarna gre otomatik olarak kullanlr ve kullanc bunlara direkt olarak eriemez. Bunlara Bank Register ad verilir. Bu modlar ( User, FIQ, IRQ,SCV and Undef ) arasnda deiim interreptlar srasnda donanmsal olarak olabilecei gibi CPSR yazmacna program tarafndan ilgili blme kodlar girilerek de yaplabilir.(Bunu gerekletrmek iin Privilegedi evet olan bir modda olmak gerekir) lemcinin modlar ve gei yaplabilecei bit durumlar aadaki ekilde ayrntl olarak gsterilmitir.

ARM 2 Komut Setlerine Giri


ARMda iletilen komutlarn hepsi geriye dnk uyumlu alr. Bunu amak gerekirse teknoloji ilerledike ARM 5-6-7 gibi srmler kard batan beri karlan yeni srmlere yeni komutlar eklenmesi gerekiyordu. Bunun iin ltfen kodlarnz yazmadan nce elinizde bulunan ARM ilencinin model ve seri numarasn iyi bilin. Bu numaraya bal olarak aada yer alan komutlarn hangisini kullanabileceinizi renmi olursunuz. ARM Komut Seti Uyumluluk Tablosu

Komutlarmzn hangi srmlerde geerli olduunu rendikten sonra komut setlerinin temel yapsna deinelim. ncelik komutlar prefix ve postfix ekler alrlar. rnek olarak Hafzann bir blmne ulamak iin prefix ve postfix komulara ihtiya duyulur. mem<data_size>[adress] eklinde bir komut varsayarsak ; mem32[1024] burada 32 prefix 1024 ise postfixdir. Yani 32 bitlik balang adresi 1Kb olduunu belli eder. Arm komutlar verileri register iinde ilerler. Bu yzden verileri ilemeden nce mutlaka registerlara transfer edilmesi gerekmektedir. Bu bilgi bizim iin ok nemlidir. Bunu yapmann yolu hafzada load/store komutlar kullanarak verinin yazmalara alnmasn salamaktr. ARM komutlar genel olarak 3 veya 2 operand alrlar. Bunu bir rnek ile aklamak gerekirse; ADD r0(rd),r1(rn),r2(rm) Komutu r2 ve r1 yazmalarnn iindeki deerleri toplayarak sonucu r0 yazmacnn iine atar. burada rd, rn ve rm deerlerini ARM1 adl yazmzda gsterdiimiz ilk fotorafta yer alan blok diyagramda hangi registerlar olduunu gstermesi iin ekledim. Buradan elde edilecek bilgi eer komut setinde barrel shifter kullnmak istiyorsak bunu sadece rm iareti olan r2 yazmacnda yapabiliriz.

ARM Veri leme Komutlar

MOV Komutu : Mov komutu her mikroilemcide olduu gibi ARM mikroilemcilerinde de bulunur. Kullanm ok basittir. lem yapmadan nce registera istenilen ilk deerlerin yklenmesini salar. Kullanm yaps u ekildedir. <instruction>{<condition>} {S} Rd, N MOV r0, r1 veya MOV r0,5 iki rnektede grld gibi R1 ve 5 ifadesi N deerine karlk gelmektedir. Yani MOV komutu ile sabit bir say veya bir yazma deerini dier bir yazmaa atabiliriz. MVN Komutu : Mov komutunun yapt ilemin yannda sonucun deilini alr. MVN Rd,N yazarsak N iindeki deerin deilini alr yani sonu olarak Rd deeri ~N e eit olur.

Barrel Shifter : lk yazlarmzda da deindiimiz gibi komutlarmzn iinde barrel shifter kullanabiliriz. Bu ilemi yapabilmemiz iin deerin Rm yazmac iinde olmas gerekir.( Bknz : ARM-1 Yazs ilk ekil) Bu kaydrc vastasyla register iindeki deeri, komutun belirtildii sini deitirmeyecektir. Ksaca sonular ALUda ileme tabi tutulmadan nce barrel shifter vastasyla n ileme tutulurlar. MOV r7, r5, LSL #2 ; Bu ilemin sonunda r7 = r5*4 = (r5 << 2) olur.( Saysal devrelerden hatrlarsanz bir sayy iki sola kaydrmak sayy 4 ile arpmak ile eittir. Yine ayn ekilde sayy 2 saa kaydrmak sayy 4e blmek demektir. Barrel Shifter ile kullanacamz komutlar aada gzkmektedir. Operation Description Logical shift left Logical shift left Logical shift right Logical shift right Assembler Cycles

LSL Rd, Rn, #<imm>1 LSL Rd, Rn, Rs 1

LSR Rd, Rn, #<imm>1 LSR Rd, Rn, Rs 1

Arithmetic shift rightASR Rd, Rn, #<imm>1 Shift Arithmetic shift rightASR Rd, Rn, Rs 1

Burada greceiniz zere komutlarn ka cycle alaca aklanmtr ve iki trl kullanm bulunmaktadr. Bu kullanmlar herhangi bir registern deeri belirlenen sabit bir say kadar kaydrlabilir veya herhangi bir yazmacn belirttii deer kadar kaydrabilir. Son olarak bir rnek verelim. cpsr = nzcvqiFt_USER | r0 = 000000000 | r1 = 080000004 MOVS r0, r1, LSL #1 cpsr = nzCvqiFt_USE | r0 = 000000008 | r1 = 080000004

Yukarda rneimizde ilk nce cpsr bitlerimizin bilgi durumu gsterilmitir. daha sonra r0 vr r1 yazmalarnn ilk deerleri belirlenmitir. Burada MOVS komutu grlmektedir. Bu komut yeni bir komut deildir sadece mov komutuna ekstra zellik kazandrmaktadr. Buradaki S harfi cpsr yazmacnn deerini gncelleme demektir. MOVS komutu iletildiinde grld gibi r1 yazmac bir bit sola kaydrlm ve sonu r0 yazmacna yazlmtr ve cpsr yazmac da C byk harfle gsterilmitir yani elde olmutur.

ARM 3 Aritmetik ve Mantk Komutlar


Bu yazmzda ARM mimarisinde kullanlan Aritmetik ve Mantk komutlarna deineceiz. Aritmetik operasyonlarda toplama ve karmay reneceiz arpma ilemini ise dier komutlara gre biraz daha kark olduu iin ona ayrca deinmeyi dnyorum. Mantksal operatrler blmnde ise adnda anlalabilecei zere and or xor gibi komutlar yer alacak. Aritmetik Operasyonlar Aritmetik operasyonlar iin kullanlan komut yaps aada gzkmektedir. <instruction>{<cond>}{S} Rd, Rn, N

Aada yer alan tablodan ise kullanlabilecek komutlar ve bu komutlarn aklamalarn bulabilirsiniz.

ADC ADD SUB

32 bitlik 2 veriyi ve elde bitini toplar Rd = Rn + N + carry 32 bitlik 2 veriyi toplar 32bitlik 2 sayy karr Rd = Rn + N Rd = Rn N

RSC

Normal karma ileminde eksilen ve farkn yerleri deimesine ilave olarak eldenin de hesaba katlmas Rd = N Rn !(carry flag) Normal karma ileminde eksilen ve farkn yerleri deimitir Rd = N Rn Elde bitini hesaba katarak karma ilemi

RSB

SBC

Rd = Rn N !(carry flag)

Kullanacamz komutlar akladktan sonra imdi biraz grsel rnekler zerinde alalm. Balang olarak r0 = 000000000 | r1 = 000000002 | r2 = 000000001 deerlerimizin olduunu dnelim. SUB r0, r1, r2 komutunu uyguladktan sonra r0 = 000000001 olacaktr. Balang olarak r0 = 000000000 | r1 = 000000077 | olduunu dnelim. RSB r0, r1, #0 komutunu uygularsak 0 dan r1 deerini karr. Yani; Rd = 00 r1 r0 = -r1 = 0xffffff89 olacaktr.

Bu sefer RSB komutunu uygulayalm.

Yukardaki komut dikkatli incelenirse SUB komutunun tersi bir yapya sahiptir. Yani SUB komutuna gre eksilen ve fark yer deitirmitir. Bir sonraki rneimizde komut yapsnda yer alan S ekini

kullanalm. Hatrlayacanz zee komuta ek olarak kullanlan S komutu cpsr iindeki bitleri gncellemeye yaryordu. cpsr = nzcvqi | r3 = 000000001 | deerimizin olduunu dnelim. SUBS r3, r3, #1 komutu ile r3 yazmacndan 1 karp sonucu yine r3 yazmacna yazarz r3 = 000000000 sonu olara r3 0a eit olacak ve nZCvqi gncellenecektir.

Bu zamana kadar genelde karma ilemi yaptk bu rneimizde ise hem barrel shifter hemde toplama rneimizi yapalm. Balang olarak r2 = 000000000 | r4 = 000000005 olduunu dnelim. ADD r2, r4, r4, LSL #2 komutunu uygularsak r4 yazmac ilk olarak iki kere sola kaydrlacak ( 4 ile arplacak ) ve daha sonra tekrar r4 ile eklenip r2 ye yazlacak yani 5 * r4 ilemi yaplm olacaktr. r2 = 000000014 | r4 = 000000005 olacaktr. Son olarak aritmetik ilemlerimizi iaretli ve iaretsiz olarak ( signed and unsigned) olarak yapabileceimizi hatrlatarak konumuza arpmada kullanlacak komutlarla devam edelim. arpma Komutlar arpma komutlarn kullanrken dikkat etmemiz gereken en nemli husus arpmann sonucunun ka bit olacadr. Eer arpma ileminin sonucu 32 biti ayorsa burada sonucun 64 bitlik sonu reten arpma kodlarn kullanmamz gerekmektedir.
MLA MUL SMLAL SMUL UMLAL UMULL arp ve Topla arp aretli olarak uzun arp ve topla aretli uzun arpma aretsiz olarak uzun arp ve topla aretsiz uzun arpma Rd = (RmRs) + Rn Rd = RmRs [RdHi, RdLo]=[RdHi, RdLo]+ (Rm Rs) [ RdHi, RdLo]= Rm Rs [RdHi, RdLo]=[RdHi, RdLo]+ (Rm Rs) [RdHi, RdLo]= Rm Rs

Yukarda ki tabloda grlen komutlarn yaps u ekildir. MLA ve MUL komutlar iin {<cond>}{S} Rd, Rm, Rs, Rn Dier 4 komut iin <instruction>{<cond>}{S} RdLo, RdHi, Rm, Rs

Burada ufak bir hatrlatma yapmak istiyorum. Komutun iletme evrimi (instruction cycle) 1 deildir. Bu zaman ilemcinin mimarisine ve rs iindeki saynn geniliine gre deimektedir. Son olarak MUL ve UMULL komutlarn kullanalm. r0 = 000000000 | r1 = 000000002 | r2 = 000000003 ilk deerlerine sahip olduunu dnelim. MUL r0, r1, r2 ; komutu ile r2 ve r1 arplp sonu r0a atlr. Yani r0 = r1*r2 . r0 = 000000006 | r1 = 000000002 | r1 = 000000003

imdi 32 bitlikten geni bir yer tutan arpma ilemini iaretsiz olarak yapalm.

r0 = 000000000 | r1 = 000000002 | r2 = 0xf0000002 | r3 = 000000002 ilk deerlerini dnelim UMULL r0, r1, r2, r3 ; komutunu uygularsak sonu 32 bitten fazla olacandan dolay ilemin sonucu yksek 32 bit r1 yazmacnda ve dk 32 bit r0 yazmacnda olmak zere tutulacaktr. Yani [r1,r0] = r2*r3 olacaktr.

r1 = 000000001 (Yksek 32 bit) | r0 = 0xe0000004 (Dk 32 bit)

Mantk Komutlar Yazmzn ikinci blm mantk operasyonlarn iermektedir. Mantk operatrleri aada aklamalar ile yer almaktadr. Bu aklamalara girmeden nce komut yapsn verelim. Komut yaps aritmetik operatrlerin kullanm ile ayndr. <instruction>{<cond>}{S} Rd, Rn, N

AND OR EOR BIC

32 bitlik 2 veriyi ve ilemine tabi tutar Rd = Rn & N 32 bitlik 2 veriyi or ilemine tabi tutar Rd = Rn | N 32bitlik 2 sayy xor ilemine tabi tutar Rd = Rn N 32bitlik 2 sayy ve deil ilemine tabi tutar Rd = Rn & N

Mantk operatrlerinin kullanm hakknda birka rnek ile komutlarmz pekitirelim.

r0 = 000000000 | r1 = 002040608 |r2 = 010305070 | ilk deerlerini dnelim. ORR r0, r1, r2 komutunu uygularsak r0 = 012345678 sonucuna ularz. Son rnek olarak BIC komutunu kullanalm. Bu komutun yapt ilem yukarda da belirttiimiz zere ve deil ilemidir. r0 = 0b0000 | r1 = 0b1010 | r2 = 0b0101 olarak tanmlansn. Burada tanmlamamzn binary olduunu unutmayn. BIC ro,r1,r2 komutunu ugularsak ( r0 = r1 and (not r2)) ilemini yapm oluruz. r0 = 0b1010 sonucuna ularz

ARM 4 Karlatrma ve Dallanma Komutlar


Karlatrma Komutlar
Armda salarz. karlatrma komutlarnn kullanm ou mikroilemcinin komutlaryla benzerlik gstermektedir. Karlatrma ilemlerinin yannda test ilemlerini de bu komut kmeleri ile Bu komut tiplerinde sonulara gre durum bayraklar gncellenir. Kullancnn yazmalarnn deeri bu komutlarla deitirilmez. Yazlacak programlarda gncellenen bayraklarn durumundan sonra deineceimiz kullanlacak conditional komutlarla programda istenilen yere dallanma yaplmasna olanak salar. Bu tr komutlarmzn kullan biimi aada gsterilmitir. Burada dier komutlardan farkl olarak S yapsnn olmadna dikkat edelim. S harfi komuta durum bayraklarn gncelle anlam katyordu. Bizim kullanacamz komutlarn hepsi otomatik olarak durum bayraklarn gncelledii iin burada S harfinin kullanlmamas gerekiyor. Kullanacamz komutlarn listesini ise aadaki tablodan grebilirsiniz. <instruction>{<cond>} Rn, N 32 bitlik 2 sayy 2.sinin tersini alarak Sonu Rn+Nye gre Z CMN karlatrr. bayran set eder. Sonu Rn-Nye gre Z CMP 32 bitlik 2 sayy karlatrr. 32bitlik 2 sayy veya operatr ile TEQ karlatr 32bitlik 2 sayy ve operatr ile TST karlatr Sonu Rn and N olur. Sonu Rn xor N olur. bayran set eder.

Yukardaki tablodan greceiniz zere aslnda bu komutlarla yaplan ilemleri daha nce renmitik. CMP ile karma ilemi yapp sonucuna gre eer ilemin sonucu sfrsa SIFIR bayra 1 yaplr. CMN ileminde de ayn mantk kullanlmakla birikte sadece ikinci register deerinin tersi alnarak karlma yaplmaktadr. TEQ ilemi ile mantksal xor ve yine benzer ekilde TST ile mantksal ve ilemi yaplr sonuca gre bayraklarn durumu gncellenir. Son olarak konu ile ilgili olarak basit bir rnek verelim. cpsr = nzcvqi bayrann ilk nceki durumu r0=24 | r2=24 CMP r0, r2 cpsr = nZcvqi bayrann son durumu. Grdnz gibi Z bayra 1 olmutur. Burada ro ve r1 deeri birbirinden karldnda sonu sfr olduundan dolay Z biti 1 yaplmtr.

Dallanma Komutlar Dallanma komutlar ile alt programlarn altrlmas dnglerin yaplmas ve if-else gibi komutlarn iletilmesi mmkn olmaktadr. Aada kullanabileceiniz komutlarn listesi bulunmaktadr.

Dallanma

pc = etiket pc = etiket | lr = blden sonra gelen bir sonraki komutun adresi pc = Rm & 0xfffffffe, T = Rm &1 pc = etiketpc = Rm & 0xfffffffe, T = Rm &1 lr = blden sonra gelen bir sonraki komutun adresi

BL

Link ile dallanma

BX

Dallanma deiimi

BLX

Link ile dallanma deiimi

Bu komutlarn kullanm sz dizimi u ekildedir. B{<cond>} etiket BL{<cond>} etiket BX{<cond>} Rm BLX{<cond>} etiket | Rm

Laf ok fazla uzatmadan rneklere geelim isterseniz. lk rneimizde ileri veya geri dallanmann nasl gerekletireceimizden bahsedeceiz.

B ilerle ADD r1, r2, #4 CMP r0, r6, ADD r3, r7, #4 ilerle AND r1, r1, r3 dongu ADD r1, r2, # CMP r0, r6, AND r1, r1, r3 B dongu
lk rneimizde B ileri komutu ile altnda belirtilen kodlar ilenmeden direkt olarak ilerle etiketine srama yaplmtr. kinci rneimizde ise surekli olarak b dongu etiketine dn oluturan her seferinde etiketin altndaki kodlarn iletildii sonsuz bir dng tanmlanmtr.

Bundan sonraki rneimiz ise bir alt programn ana programdan nasl arld ile ilgilidir. BL AltProgram ; AltPrograma dallanma CMP r1,r2 ADD r1,r2,r3 AltProgram CMP r2,r4 ADD r5,r6,r8 MOV pc, lr ; BLnin alt satrna geri dndrme bu programn incelenmesini yaparsak ilk nce BL ile AltProgram etiketi arlr daha sonra bu etiketin altndaki komutlar ilendikten sonra link yazmacnn deerini program yazmacna atarak programn BL kodunun alt tarafndan yani CMP r1,r2 ile tekrar balatlmas salanr.

ARM 5 Ykleme ve Hafzaya alma Komutlar(Load and Store)


Arkadalar bu konumuz ile ARM mimarisinin renilmesi yolunda bir basamak daha ne kyoruz. Bildiiniz gibi ARM mimarisi RISC yapdadr. RISC yaplarnn en byk zellii bellek (memory) iinde komutlar ileyememesidir. Verileri ileyebilmemiz iin yaplmas gereken; ilenecek bilginin yazmalara aktarlmas >burada ileme tutulmas > son olarak tekrar ilenmi bilginin bellein ilgili yerine tanmas eklinde zetlenebilir. Bu yzden bizde bellein herhangi bir yerinde duran bilgiyi kullanabilmemiz iin bu bilgileri ilk nce ARM mikroilemcisinin yazmalarna karmamz gerekir. te bugn sizinle bu konuya deineceiz. Konumuz baya uzunca bir konu olduu iin iki konuya blp de anlatmay dnyorum.

Tek Yazmaca Transfer


Bu tr komutlara bir yazmaca veri almak veya bir yazmatan veri karmak amacyla kullanlr. aretli veya iaretsiz 32 bitlik , 16 bitlik ve 8 bitlik veriler bu komutlar yardmyla ilenebilir. Komutlarn kullanm eklini aada gsterildii gibidir. <LDR|STR>{<cond>}{B} Rd,Adresleme1 LDR{<cond>}SB|H|SH Rd, Adresleme2 STR{<cond>}H Rd, Adresleme2
32 bitlik (word) veriyi yazmaca ykle 32 bitlik veriyi yazmatan bellee ykle 8 bitlik (byte) veriyi yazmaca ykle 8 bitlik veriyi yazmatan bellee ykle 16 bitlik (half word) veriyi yazmaca ykle 16 bitlik veriyi yazmatan bellee ykle aretli 8 bitlik (byte) veriyi yazmaca ykle aretli 8 bitlik veriyi yazmatan bellee ykle Rd <- bellek32[adres] Rd -> bellek32[adres] Rd <- bellek8[adres] Rd -> bellek8[adres] Rd <- bellek16[adres] Rd -> bellek16[adres] Rd <- bellek8[adres] (aretli) Rd -> bellek8[adres](aretli)

Bu syntaxa sahip komut setlerinin tamam ise aada gsterilmitir.


LDR STR LDRB STRB LDRH STRH LDRSB LDRSH

Konunun anlalmas iin basit bir rnek yazalm ve bu rnei bir grsel ile ifade edelim. MOV ro,5 MOV r1,200 STR ro,[r1] LDR r2,[r1]

Bu kod blouuzda MOV komutuyla yazmalara balang deerini vermi bulunmaktayz. Daha sonra ise STR komutuyla ro deerini r1in gsterdii bellekteki adrese yazlmas gerekletrilmitir. STR komutuyla yaplan i ise r1 in gsterdii adres deerinin iinde yer alan verinin r2 yazmacna yklenmesidir. Bu konu iin grsel aklama aada yer almaktadr. Grsel konuyu anlamanz

kolaylatracaktr. Burada tanan saylar 32 bit eklindedir. Eer 16 bit veya 8 bit uzunluunda ilemler yapmak isteseydik yapmamz gereken tek ey tabloda buna karlk gelen deerleri programmzda yazmak olacakt.

Tek Yazma Adresleme Modlar


Adresleme modu belirli bir balang deerinin zerine ofset deerinin eklenmesi eklinde yorumlanabilir. Bu ofset deeri 12 bitlik bir sabit sayya kadar (4096) olabilecei gibi , bir yazmacn iindeki deer de olabilir. 3 eit adresleme modu bulunmaktadr. Bunlar aadaki tabloda gsterilmitir. Balang Adres ndexleme Yntemi
Preindex with writeback Preindex Postindex

Veri
bellek[balang yazmac + ofset] bellek[balang yazmac + ofset] bellek[balang yazmac

Yazmc
balang yazmac + ofset gncellenmez balang yazmac + ofset

rnek
LDR r0,[r1,#4]! LDR r0,[r1,#4] LDR r0,[r1],#4

Tabloyu aklamak gerekirse preindexde yap ncelikle tamann gereklemesi prensibine dayanr eer base yazmacnn deerinin gncelleme istersek ! nlem iareti kullanmamz gerektiini grrz.Post indexleme de ise tama ileminin sonradan gereklemesi ve base yazmacnn otomatik olarak deer arttrmas gereklemektedir. Bu modlarn birbirine gre avantaj ve dezavantajlar bulunmaktadr. Preindexde bir veri yapsnn elemanlarna eriim salanabilirken post index ve preindex with write back belli bir array iinde gezinti yapmak iin idealdir. Konunun anlalmas iin yine basit bir rnek zerinden gidelim. MOV ro,5 MOV r1,200 STR ro,[r1, #12]

Kod parasn dnelim. Burada yaplan temel ilem ilk rnekten farkl olarak r1in gsterdii adrese 12 eklenerek ron iindeki 5 saysnn bu adrese yazlmasdr. Bunu aada yer alan grsel ile aklayabiliriz.

Yukardaki rneimize ek olarak eer veriyi 0*1f4 adresinde saklamak isteseydik STR ro,[r1, #-12] komutunu kullanmamz gerekecekti. Yine ayn ekilde base yazmacnn deerini otomatik olarak deitirmek isteseydik STR ro,[r1, #12]! kullanmamz gerekecekti. Btn kullanm yntemlerinin akland tabloya aadan eriebilirsiniz.

Adresleme Modu ve ndexleme Yntemi


Sabit bir deerler nindexleme Register ile nindexleme

Yaps
[Rn, #+/-ofset_12] [Rn, #+/-offset_12]

Barrel Shifter ile register nindexleme [Rn, +/-Rm, shift #kaydrma_miktar] Preindex writeback ile sabit bir deerle nindexleme Preindex writeback ile register kullanlarak nindexleme Barrel Shifter ile register kullanlarak Preindex writeback Sabit bir deerler sonindexleme Register kullanarak son indexleme Barrel Shifter ile register kullanlarak Son indexleme [Rn], +/-Rm, shift #kaydrma_miktar [Rn, +/-Rm, shift #kaydrma_miktar]! [Rn], #+/-offset_12 [Rn], +/-Rm [Rn, +/-Rm]! [Rn, #+/-ofset_12]!

Bugnk son rneimizi ise post indexleme kullanarak verelim. MOV ro,5 MOV r1,200 STR ro,[r1], #12

Burada postindexleme kullanlmtr. Dier rneklerden deiik olarak burada 5 deeri ilk nce 200 adresine yazlr daha sonra base yazmacnn deeri 12 arttrlarak 0*20c olur. Aadaki ekilden post

indexleme

ile

yaplan

ilemi

daha

iyi

anlayabilirsiniz.

Yine ayn ekilde eer veriyi 0*200 adresinde tutup base yazmacnn son deerinin 0*1f4 adresini gstermesini isteseydik STR ro,[r1], #-12 komutunu kullanmamz gerekecekti.

Vous aimerez peut-être aussi