TEXT 48
Arm.txt Guest on 25th June 2020 03:46:09 AM
  1. --------------------------------------------------------------------------
  2. Osnovne informacije:
  3. -- 1983. Acorn Computers Ltd.
  4. -- Krajem 80-tih: Apple + Acorn = ARM Limited.
  5. -- Verzije arhitekture: v1-v6. Prve tri su zastarele. Imale su
  6.    26-bitni adresni prostor. Verzija 4 predstavlja osnovu savremene
  7.    32-bitne ARM arhitekture. Na vezbama cemo izucavati instrukcije
  8.    ove arhitekture.  
  9. -- RISC arhitektura. Uniformna duzina (32-bita) i format instrukcija.
  10.    Relativno veliki broj registara opste namene (16).
  11. -- Load/Store arhitektura. Jednostavni (a mocni) adresni modovi.
  12. -- Moze biti little endian i big endian, zavisno od hardvera u koji se
  13.    ugradjuje. Mi cemo na vezbama raditi na little endian platformi.
  14.  
  15. -------------------------------------------------------------------------
  16. Dodatne karakteristike:
  17. -- Uslovno izvrsavanje instrukcija - instrukcija se moze izvrsiti ili
  18.    ne u zavisnosti od ispunjenosti odredjenog uslova.  
  19. -- Opciono azuriranje flegova - vecina instrukcija ne azuriraju obavezno
  20.    flegove u statusnom registru, vec samo kada se to eksplicitno zahteva.
  21. -- Shiftovanje je opcioni deo vecine instrukcija. Ne postoje posebne
  22.    instrukcije za shiftovanje.
  23. -- Memorijski pristup mora biti poravnat. Podaci velicine 4 bajta (reci)
  24.    moraju biti na adresi deljivoj sa 4. Podaci velicine 2 bajta (polureci)
  25.    moraju biti na adresi deljivoj sa 2. Instrukcije se uvek nalaze na
  26.    adresi koja je deljiva sa 4.
  27.  
  28. --------------------------------------------------------------------------
  29. Registri:
  30.  
  31. postoji 16 32-bitnih registara opste namene oznacenih sa r0-r15. Registar
  32. r15 se oznacava i kao pc (program counter) i ima specijalnu ulogu.
  33. Ovom registru se u vecini slucajeva moze pristupati kao i svim ostalim
  34. registrima. Prilikom pisanja u ovaj registar vrsi se skok na upisanu
  35. adresu. Prilikom citanja vrednosti ovog registra, dobija se adresa tekuce
  36. instrukcije plus 8 (prefetching).
  37.  
  38. --------------------------------------------------------------------------
  39. Pregled instrukcija:
  40.  
  41. Load/Store instrukcije.
  42. --------------------------------------------------------------------------
  43.  
  44. Svi memorijski transferi se obavljaju instrukcijama iz ove grupe. OSTALE
  45. INSTRUKCIJE NE MOGU IMATI MEMORIJSKE OPERANDE!!
  46.  
  47.  -- Ucitavanje iz memorije:
  48.    LDR -- ucitava jedan 32-bitni podatak.
  49.    LDRB -- ucitava jedan bajt, a ostatak registra je prosiren nulama.
  50.    LDRH -- ucitava 16-bitni podatak. Ostatak se prosiruje nulama.
  51.    LDRSB -- ucitava jedan bajt. Ostatak se popunjava bitom znaka.
  52.    LDRSH -- ucitava 16-bitni podatak. Ostatak se popunjava bitom znaka.
  53.  
  54.  -- Cuvanje u memoriju:
  55.    STR -- kopira 32-bitni podatak u memoriju
  56.    STRB -- kopira jedan bajt (bajt najmanje tezine) u memoriju.  
  57.    STRH -- kopira 16-bitni podatak (niza polovina registra) u memoriju.
  58.  
  59.    ARM Load/Store adresni modovi:
  60.  
  61.    -- offset: bazni registar + offset koji moze biti +/- 12-bitna
  62.    konstanta, ili +/- drugi registar, koji opciono moze biti shitovan za
  63.    konstantan broj pozicija. Primeri:
  64.  
  65.    ldr r0, [r1, #4]    @ ucitava rec sa adrese r1 + 4
  66.    ldr r0, [r1, #-8]   @ ucitava rec sa adrese r1 - 8
  67.    str r0, [r1, r2]    @ cuva vrednost r0 na adresu r1+r2
  68.    str r0, [r1, -r2, lsl #2]  @ cuva vrednost r0 na adresu r1 - 4*r2
  69.  
  70.    NAPOMENA: Konstanta moze biti izmedju -4096, +4096
  71.    NAPOMENA: Kod instrukcija strh, ldrh, ldrsb i ldrsh nisu moguci shifteri,
  72.    a konstanta mora biti osmobitna.
  73.    NAPOMENA: zapis [r1, #0] se krace zapisuje kao [r1] (bazno adresiranje).
  74.  
  75.  
  76.    -- pre-indexed: isto kao i offset, samo sto se bazni registar
  77.    azurira na izracunatu adresu. Npr:
  78.  
  79.    ldr r0, [r1, #8]!      @ Ucitava rec sa adrese r1+8 a zatim registar r1
  80.                           @ postavlja na r1+8 (kao ++r1 u C-u).
  81.  
  82.    -- post-indexed: isto kao i offset, samo sto se bazni registar
  83.    azurira nakon sto se njegova originalna vrednost upotrebi kao
  84.    adresa. Npr:
  85.  
  86.    str r0, [r1], #4       @ Cuva r0 na adresu r1, a zatim r1 uvecava za 4.
  87.                           @ (kao r1++ u C-u).
  88.  
  89.      
  90.  
  91.    NAPOMENA: Moguci shifter-i su:
  92.     --LSL: shiftovanje u levo
  93.     --LSR: logicko siftovanje u desno
  94.     --ASR: aritmeticko siftovanje u desno
  95.     --ROR: rotacija u desno.
  96.     --RRX: rotacija kroz C flag za jednu poziciju.
  97.  
  98.  
  99.   NAPOMENA: Instrukcije ne mogu imati apsolutnu adresu kao operand.
  100.   Medjutim, u asembleru se moze navesti labela. Prilikom prevodjenja,
  101.   ta labela ce biti zamenjena offset adresiranjem sa baznim registrom PC.
  102.   Uslov je da labela nije predaleko u odnosu na tekucu instrukciju (+/-4K)
  103.  
  104.   NAPOMENA: Instrukcija poput LEA IA-32 instrukcije ne postoji. Medjutim,
  105.   postoji asemblerska pseudo-instrukcija ADR koja radi slicnu stvar, a
  106.   koja se prilikom prevodjenja obicno prevodi u ADD ili SUB
  107.   instrukciju. Ova instrukcija ima oblik:
  108.  
  109.   adr <registar>, <labela>
  110.  
  111. --------------------------------------------------------------------------
  112. Instrukcije za obradu podataka.
  113.  
  114. Ove instrukcije vrse jednostavnu obradu podataka kao sto su sabiranja i
  115. oduzimanja, zatim poredjenje i testiranje.
  116.  
  117. Instrukcije za izracunavanje:
  118.  
  119.  -- ADD -- sabiranje dva operanda
  120.  -- ADC -- sabiranje sa prethodnim prenosom
  121.  -- SUB -- oduzimanje dva operanda
  122.  -- SBC -- oduzimanje sa pozajmicom
  123.  -- RSB -- obrnuto oduzimanje
  124.  -- RSC -- obrnuto oduzimanje sa pozajmicom
  125.  -- AND -- bitovska konjunkcija
  126.  -- EOR -- bitovska ekskluzivna disjunkcija
  127.  -- ORR -- bitovska dijunkcija
  128.  
  129. Gornje instrukcije imaju 3 operanda: prvi je odredisni registar, drugi je
  130. jedan source operand (uvek registar) a treci je drugi source operand
  131. (zadat kao shifter_operand, vidi dole). Instrukcije mogu imati sufiks S, u
  132. kom slucaju azuriraju flegove.
  133.  
  134. Instrukcije poredjenja i testiranja:
  135.  
  136.  -- CMP -- uporedjivanje (oduzimanjem) i azuriranje flegova
  137.  -- CMN -- uporedjivanje (sabiranjem) i azuriranje flegova.
  138.  -- TST -- testiranje (bitovskom konjunkcijom) i azuriranje flegova
  139.  -- TEQ -- testiranje (ekskluzivnom disjunkcijom) i azuriranje flegova
  140.  
  141. Gornje instrukcije imaju dva operanda: prvi je registar, a drugi je
  142. shifter_operand. Uvek azuriraju flegove.
  143.  
  144. Instrukcije transfera medju registrima:
  145.  
  146.   -- MOV -- premestanje iz registra u registar
  147.   -- MVN -- premestanje uz prethodno komplementiranje bitova
  148.  
  149. Gornje instrukcije imaju dva operanda: Prvi je registar, a drugi je
  150. shifter_operand. Mogu imati sufiks S, u kom slucaju azuriraju flegove.
  151.  
  152. shifter_operand je:
  153.  -- 32-bitna konstanta (ne mogu bas sve konstante, vidi dokumentaciju)
  154.  -- registar
  155.  -- registar shiftovan za konstantan broj pozicija
  156.  -- registar shiftovan za broj pozicija koji je dat u nekom drugom
  157.     registru.
  158.  
  159. Primeri:
  160.  
  161. add r0, r0, #1      @ inkrementira r0
  162. sub r0, r1, r2      @ r0 = r1 - r2
  163. rsb r0, r1, r2, lsl #1      @ r0 = 2*r2 - r1
  164. and r0, r1, r2, lsl r3      @ r0 = r1 & (r2 * 2^r3)
  165.  
  166. mvn r0, r0          @ negira bitove r0
  167. rsb r0, r0, #0      @ upisuje -r0 u r0.
  168. mov r0, r0, lsl #2  @ mnozi r0 sa 4.
  169.  
  170. --------------------------------------------------------------------------
  171. Instrukcije  mnozenja.
  172.  
  173.    -- MUL -- ima tri operanda, i svi su regiistri: mnozi druga dva i
  174.              smesta nizih 32 bita proizvoda u prvi operand. Nije bitno
  175.              da li je oznaceno ili ne, jer nizi bitovi ne zavise od toga.
  176.    -- MLA -- ima cetiri operanda (svi su registri): mnozi druga i treci,
  177.              sabira ih sa cetvrtim i nizih 32 bita te vrednosti smesta u
  178.              prvi operand.
  179.  
  180.    -- UMULL -- ima cetiri operanda. Prvi predstavlja odrediste
  181.                nizih 32 bita, drugi predstavlja odrediste visih 32 bita,
  182.                a treci i cetvrti predstavljaju cinioce. UMULL vrsi
  183.                neoznaceno mnozenje.
  184.    -- SMULL -- isto kao i UMULL, samo vrsi oznaceno mnozenje.
  185.    -- UMLAL -- ima cetiri operanda. Prvi predstavlja nizih 32 bita
  186.                operanda koji se dodaje na proizvod, kao i odrediste za  
  187.                nizih 32 bita rezultata. Drugi predstavlja visih 32 bita
  188.                operanda koji se dodaje, kao i odrediste za visih 32 bita
  189.                rezultata. Treci i cetvrti predstavljaju cinioce. Vrsi
  190.                neoznaceno mnozenje.
  191.    -- SMLAL -- isto kao i UMLAL, samo oznaceno mnozenje.
  192.  
  193.  
  194. Svi operandi instrukcija mnozenja su registri. Na pojedinim imlementacijama
  195. postoje ogranicenja da pojedini operandi ne smeju biti isti registar, tako
  196. da to treba izbegavati. Instrukcije mnozenja mogu imati sufiks S, u kom
  197. slucaju se azuriraju flegovi u statusnom registru.
  198.  
  199.  
  200. NE POSTOJE INSTRUKCIJE ZA CELOBROJNO DELJENJE!!! Moze se simulirati
  201. uzastopnim oduzimanjem. Pod linux-om postoje u biblioteci definisane
  202. f-je __divsi3 i __udivsi3, kao i __modsi3 i __umodsi3 koje simuliraju
  203. date operacije nad oznacenim i neoznacenim brojevima.
  204.  
  205.  
  206. ---------------------------------------------------------------------------
  207. Instrukcije grananja.
  208.  
  209.   -- B -- ima jedan operand koji je labela. Labela se prevodi u relativnu
  210.           adresu u odnosu na adresu PC, i mora biti u opsegu -32M - +32M.
  211.           Instrukcija bezuslovno skace na datu adresu.
  212.  
  213.   -- BL -- isto kao i B, s tim sto adresu instrukcije koja sledi nakon BL
  214.            instrukcije smesta u registar r14. Ovaj registar se
  215.            drugacije oznacava kao lr (link register).
  216.  
  217. Skok na proizvoljnu adresu se moze implementirati upisivanjem vrednosti
  218. zeljene adrese u PC registar.
  219.  
  220. ---------------------------------------------------------------------------
  221. Uslovno izvrsavanje instrukcija.
  222.  
  223. Vecina instrukcija ARM arhitekture se mogu izvrsavati uslovno. Ovo se
  224. postize dodavanjem odgovarajuceg uslovnog koda na mnemonik instrukcije.
  225. Najcesci uslovni kodovi su EQ, NE, GT, LT, GE, LE, HI, LO, HS, LS itd.
  226. Pogledati dokumentaciju za detalje.
  227. Primeri:
  228.  
  229. addgt r0, r0, r1    -- r0 = r0 + r1 samo ako je prethodno bilo vece.
  230. subeq r1, r2, r3    -- r1 = r2 - r3 samo ako je prethodno bila jednakost.
  231. mullts r1, r2, r3   -- r1 = r2 * r3 samo ako je prethodno bilo manje.
  232.                        Azurira flegove nakon izvrsenja.
  233.  
  234. --------------------------------------------------------------------------
  235. Uslovni skokovi.
  236.  
  237. Uslovni skokovi se na ARM arhitekturi implementiraju tako sto se
  238. instrukcije B i BL izvrse uslovno, dodavanjem uslovnih kodova. Npr.:
  239.  
  240. BGT -- skace ako je vece
  241. BEQ -- skace ako je jednako
  242. BNE -- skace ako je razlicito
  243. BLT -- skace ako je manje
  244. BHI -- skace ako je vece, neoznaceno
  245. BLGT -- skace ako je vece, uz cuvanje povratne adrese u lr registru.
  246.  
  247.  
  248. --------------------------------------------------------------------------
  249. Opciono azuriranje flegova.
  250.  
  251. Instrukcije poredjenja i testiranja uvek azuriraju flegove. Ostale
  252. instrukcije to po default-u ne rade, osim kada im se doda sufiks S.
  253. Tada one azuriraju flegove na osnovu rezultata svoje operacije. Npr:
  254.  
  255. adds r0, r0, r1
  256.  
  257. azurira flegove na osnovu zbira r0+r1.
  258.  
  259. NAPOMENA: Ako instrukcija ima i uslovni kod i sufiks S, tada se uslovni
  260. kod u mnemoniku pise izmedju operacionog koda i sufiksa S (koji je uvek na
  261. kraju). Npr: addhis, subgts itd.
  262.  
  263.  
  264. ---------------------------------------------------------------------------
  265. Instrukcije za ucitavanje i cuvanje skupa registara.
  266.  
  267. -- LDM -- instrukcija ucitava iz memorije vrednosti registara iz datog
  268.           skupa.
  269. -- STM -- instrukcija cuva u memoriju vrednosti registara iz datog skupa.
  270.  
  271. Instrukcije barataju sa skupom registara koji se zadaje izmedju
  272. zagrada { }, razdvojeni zarezima. Registri se ucitavaju (ili cuvaju) sa
  273. sukcesivnih memorijskih lokacija cija je adresa zadata baznim registrom
  274. koji se zadaje kao prvi operand. Instrukcije obavezno imaju sufiks koji
  275. odredjuje adresni mod, a moze biti jedan od sledecih (u donjoj notaciji
  276. Rb oznacava bazni registar, a k je broj registara u datom skupu):
  277.  
  278. -- IA (Increment After) -- Ovo znaci da se koriste memorijske lokacije
  279. Rb, Rb+4, Rb+8,...Rb+4*(k-1).
  280. -- IB (Increment Before) -- Ovo znaci da se koriste memorijske lokacije
  281. Rb+4, Rb+8,...,Rb+4*k.
  282. -- DA (Decrement After) -- Ovo znaci da se koriste memorijske lokacije
  283. Rb,Rb-4,Rb-8,...,Rb-4*(k-1).
  284. -- DB (Decrement Before) -- Ovo znaci da se koriste memorijske lokacije
  285. Rb-4, Rb-8, Rb-16,...,Rb-4*k
  286.  
  287. U svim slucajevima najniza navedena adresa se koristi za registar sa
  288. najmanjim brojem, dok se najvisa adresa koristi za registar sa najvisim
  289. brojem medju registrima u datom skupu. Npr, za skup {r2, r5, r7} na
  290. najnizu adresu ide r2, pa zatim r5 pa na kraju r7. Isti efekat bi bio
  291. i ako se navede {r5, r2, r7}.
  292.  
  293. Primeri:
  294.  
  295. ldmia r0, {r1, r2, r3} @ r1 = [r0], r2 = [r0+4], r3 = [r0+8]
  296. ldmdb r0, {r0, r4, r2} @ r4 = [r0-4], r2 = [r0-8], r0 = [r0-12]
  297. stmib r1, {r0, r1}     @ [r1+4] = r0, [r1+8] = r1
  298. stmda r0, {r1, r2, r3} @ [r0] = r3, [r0-4] = r2, [r0-8] = r1
  299.  
  300. Ako se iza baznog registra stavi uzvicnik (!), tada se bazni registar
  301. nakon obavljene operacije azurira tako sto se uvecava za 4*k bajtova
  302. (u slucaju ia ili ib), ili se umanjuje za 4*k (u slucaju da ili db).
  303.  
  304. Primeri:
  305.  
  306. ldmia r0!, {r1, r2} @ r1 = [r0], r2 = [r0+4], r0 = r0+8
  307. stmdb r0!, {r1, r2} @ [r0-4] = r2, [r0-8] = r1, r0 = r0-8
  308.  
  309. NAPOMENA: Kada se koristi simbol !, ne sme bazni registar biti u skupu,
  310. jer je rezultat nepredvidiv u tom slucaju.
  311.  
  312. Alternativni sufiksi (prilagodjeni stek operacijama):
  313.  
  314. -- FD -- Full Descending Stack
  315. -- ED -- Empty Descending Stack
  316. -- FA -- Full Ascending Stack
  317. -- EA -- Empty Ascending Stack
  318.  
  319. Ponasanje alternativnih sufiksa, u odnosu na IA, DA, DB i IB:
  320.  
  321. LDMFA   =   LDMDA
  322. LDMFD   =   LDMIA
  323. LDMEA   =   LDMDB
  324. LDMED   =   LDMIB
  325. STMED   =   STMDA
  326. STMEA   =   STMIA
  327. STMFD   =   STMDB
  328. STMFA   =   STMIB
  329.  
  330. NAPOMENA: Na nasoj platformi se koristi iskljucivo Full Descending Stack,
  331. tako da cemo pretezno koristiti instrukcije ldmfd i stmfd za rad sa
  332. stekom. Vrh steka se cuva u registru r13 (cije je alternativno ime sp).
  333.  
  334. Primeri:
  335.  
  336. stmfd sp!, {r0,r1}  @ Potiskuje na stek r0 i r1.
  337. ldmfd sp!, {r0,r1}  @ Skida sa steka r0 i r1.
  338.  
  339.  
  340. NAPOMENA: Instrukcije stm i ldm se mogu izvsavati i uslovno. U tom slucaju
  341. uslovni kod ide izmedju: ldmgtfd, stmeqia itd.
  342.  
  343. ---------------------------------------------------------------------------
  344. C konvencije o pozivanju funkcija:
  345.  
  346. Argumenti se prenose preko registara r0,r1,r2,r3 tim redom, s leva u
  347. desno. Ako funkcija ima vise od 4 argumenta, tada se preostali argumenti
  348. prenose preko steka, pri cemu se postavljaju na stek u obrnutom redosledu,
  349. pocev od poslednjeg. Stek uobicajeno raste prema nizim adresama.
  350.  
  351. Prema konvencijama, neki registri imaju specijalne uloge:
  352.  -- r15 - pc (program counter)
  353.  -- r14 - lr (link register)
  354.  -- r13 - sp (stack pointer)
  355.  -- r12 - ip (intra-procedure-call scratch register)
  356.  -- r11 - fp (stack frame pointer)
  357.  
  358. Registri r0-r3 su tzv. "scratch" registri, tj. pripadaju pozvanoj
  359. funkciji. Registri r4-r10 pripadaju pozivajucoj funkciji. Funkcija
  360. je duzna da sacuva vrednosti registara r4-r10 kao i registara
  361. sp i fp. Ne mora da sacuva r0-r4 (koji se koriste za prenos argumenata)
  362. kao ni ip registar. Registar ip se moze koristiti i implicitno od strane
  363. linkera prilikom pozivanja "udaljenih" funkcija, tako da na ovaj registar
  364. svakako ne mozemo racunati da ce biti sacuvan nakon poziva funkcije.
  365.  
  366. Prilikom vracanja iz funkcije, po konvenciji, vrednost se smesta u r0.

Paste is for source code and general debugging text.

Login or Register to edit, delete and keep track of your pastes and more.

Raw Paste

Login or Register to edit or fork this paste. It's free.