Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Intro to ARM Assembly

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Intro to ARM Assembly

Avatar for Adrien Couque

Adrien Couque

February 06, 2012
Tweet

More Decks by Adrien Couque

Other Decks in Technology

Transcript

  1. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Plan • Introduction : ARM ? • Les processeurs ARM • Quelques instructions • Exemples
  2. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly L’assembleur • Assembleur = langage naturel pour le processeur. • Avantages : – le plus performant (si bien codé) car copie le comportement du processeur – permet la compréhension (ou le reverse engineering) de code machine • Inconvénients : – langage spécifique à la catégorie du processeur (ARM, x86, 68k...) – pas les outils d’un langage de haut niveau (chaînes de caractères, tableaux, objets...) => difficile à écrire
  3. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Origines d’ARM • ARM : anciennement Acorn RISC Machine (maintenant : Advanced RISC Machine) • Concept en 1983, prototype en 1985 • Créé pour pallier aux manques de performances des processeurs de l’époque (impossible d’avoir une interface graphique) • ARM6 : coopération avec Apple (1992) • Utilisé essentiellement pour les appareils mobiles (faible consommation) • Compatible avec Windows 8
  4. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Usages d’ARM actuellement Modèle Produits ARM7TDMI GBA,  DS,  iPod,  Garmin  (GPS) XScale Samsung  :  Omnia   Blackberry  :  8700,  Pearl ARM1136J Nokia  :  E63,  E71,  5800,  E51,  6700,  6120,  6210,  6220,  6290,  N97,  N81   HTC  :  Dream,  Magic,  Hero,  Wildfire,  Legend,  Aria   Samsung  :  Propel,  Galaxy  Ace,  Galaxy  Mini   Zune,  Kindle  DX,  ZTE  Link... ARM1176JZ iPhone  (original,  3G),  iPod  Touch,  3DS,   Samsung  Omnia,  LG  OpZmus... Cortex-­‐A8 HTC  Desire,  iPhone  3GS  +  4,  iPod  Touch  (3,  4),  iPad,  Apple  TV,   Archos,  Droids,  Palm  Pre,  Galaxy  S,  Nexus  S,  ... Cortex-­‐A9 iPhone  4S,  iPad  2,  Galaxy  S  II,  Playbook,  Xoom,  PSP  Vita,   TouchPad,  Iconia,  Eee  pad  transformer,  ... 2005 : 98% des téléphones mobiles (> 1 milliard d’appareils) 2010 : 95% des smartphones (seulement 10% des ordinateurs portables) Q4 2011 : 2,2 milliards de processeurs vendus
  5. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly ARM : RISC vs CISC • Deux grandes familles de processeurs : RISC et CISC • RISC : – Reduced Instruction Set Computer – 1 instruction assembleur => 1 instruction exécutée sur le processeur – simple et efficace • CISC : – Complex Instruction Set Computer – 1 instruction assembleur => potentiellement plusieurs instructions exécutées – plus complexe à fabriquer, plus d’options pour coder
  6. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Registres • Processeurs ARM fournissent 16 registres (valeurs 32 bits) • R15 : Program Counter (réservé) • R14 : Return address ou Link Register (réservé) • R13 : Stack pointer • R12 : Intra Procedure Call Scratch Register • R4 -> R11 : variables locales • R0 -> R3 : utilisées par les fonctions
  7. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Status Register • NegaZve : vaut 1 si le résultat est < 0 • Zero : vaut 1 si le résultat vaut 0 (ou le test d’égalité est vrai) • Carry : retenue (pour addition, soustraction et shift) • oVerflow : débordement (pour addition et soustraction) • Thumb et Jazelle indiquent la version du processeur (00 < ARMv4, 10 >= ARMv4, 01 >= ARMv5, 11 >= ARMv6) • Q : underflow et/ou saturation (ARMv5) • GE[3:0] : comportement Greater than / Equal pour instructions SIMD (ARMv6) • E : big-endian ou little-endian (ARMv6) • I, F, A : interrupt flags (empêche IRQ, empêche FIQ, empêche les aborts prématurés) 31 30 29 28 27 24 19  -­‐  16 9 8 7 6 5 4  -­‐  0 N Z C V Q -­‐ J -­‐ GE[3:0] -­‐ E A I F T M[4:0]
  8. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Shifts • Possibilité d’utiliser des valeurs numériques directement dans les opérations ex : ADD  R0,  R1,  #12 • Subtilité : tous les nombres ne sont pas valables – valable : #FF, #F000000F, #000AD000 – non valable : #00000123, #12345678 • Uniquement 8 bits pour valeur et 4 bits pour shift • Solution : construire les nombres avec des opérations
  9. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Opérations arithmétiques : addition • ADD : addition – Syntaxe : ADD<suffix>  <dest>,  <op1 >,  <op2 >   – Exemple : ADD  R0,  R1,  R2   – Résultat : dest = op 1 + op 2 • ADC : addition avec retenue – Syntaxe : ADC<suffix>  <dest>,  <op1 >,  <op2 >   – Exemple : ADCS  R0,  R1,  R2 – Résultat : dest = op 1 + op 2 + Carry • Application : addition 64 bits • ADDS   R4, R0,  R2     • ADC   R5,  R1,  R3
  10. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Opérations arithmétiques : soustraction • SUB : soustraction – Syntaxe : SUB<suffix>  <dest>,  <op1 >,  <op2 > – Exemple : SUB  R0,  R1,  R2 – Résultat : dest = op 1 - op 2 • SBC : soustraction avec retenue – Syntaxe : SBC<suffix>  <dest>,  <op1 >,  <op2 > – Exemple : SBC  R0,  R1,  R2 – Résultat : dest = op 1 - op 2 – NOT(Carry) • Soustractions en sens inverse : RSB et RSC
  11. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Opérations logiques • CMP : Compare – Syntaxe : CMP  <op1 >,  <op2 > – Exemple : CMP  R0,  R1 – Résultat : <flags> = op 1 – op 2 • AND : Et logique (ou bitwise) – Syntaxe : AND<suffix>  <dest>,  <op1 >,  <op2 > – Exemple : ANDS  R0,  R0,  #3 – Résultat : dest = op 1 & op 2
  12. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Opérations logiques (suite) • ORR : OU – Syntaxe : ORR<suffix>  <dest>,  <op1 >,  <op2 > – Exemple : ORR  R0,  R0,  #3 – Résultat : dest = op 1 | op 2 • EOR : OU exclusif – Syntaxe : EOR<suffix>  <dest>,  <op1 >,  <op2 > – Exemple : EOR  R0,  R1,  R2 – Résultat : dest = op 1 ^ op 2
  13. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Branchement • B : Branch (= GOTO) – Syntaxe : B  <address> • BL : Branch with Link (= appel de fonction) – Syntaxe : BL  <address> • Exemple : BL  my_func             B  somewhere_else             .my_func             ...some  code  here...             MOV  PC,  R14             .somewhere_else  

  14. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Mémoire • LDR : Load Register – Syntaxe (simple) : LDR  R0,  [R1] – Résultat : R0 = data à l’adresse R1 • STR : Store Register – Syntaxe (simple) : STR  R0,  [R1] – Résultat : stocke le contenu de R0 à l’adresse R1 • LDM : Load Multiple, STM : Store Multiple • MOV : affectation (MOV  R0,  #5  =>  R0  =5)
  15. Opérations conditionelles • EQ  :  EQual  (Z  ==  1)  

    • VS  :  oVerflow  Set  (V  ==  1)   • HI  :  Higher  than  (C  ==  1  et  Z  ==  0)   • GT  :  Greater  Than  ((N&V  |  !N&!V)  &  !Z)   • LT  :  Less  Than  (N&!V  |  !N&V)   • PL  :  PLus  (N  ==  0)   • CS  :  Carry  Set  (C  ==  1)   • AL  :  ALways   NE  :  Not  Equal  (Z  ==  0)   VC  :  oVerflow  Clear  (V  ==  0)   LS  :  Lower  than  or  Same  (C  ==  0  ou  Z  ==  1)   LE  :  Less  Than  or  Equal  ((N&!V  |  N&!V)  &  !Z)   GE  :  Greater  Than  or  Equal  ((N&V  |  !N&!V)   MI  :  Minus  (N  ==  1)   CC  :  Carry  Clear  (C  ==  0)   NV  :  NeVer 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM Assembly Exemples d’utilisation : • BEQ  :  Branch  if  EQual   • ADDLT  :  ADD  if  Less  Than   • LDRGE  :  LoaD  Register  if  Greather  than  or  Equal
  16. Exemple : x = (a + b) - c ADR

     r4,a     LDR  r0,[r4]     ADR  r4,b     LDR  r1,[r4]     ADD  r3,r0,r1     ADR  r4,c     LDR  r2,[r4]     SUB  r3,r3,r2   ADR  r4,x     STR  r3,[r4]   ; récupération de l’adresse de a ; récupération de la valeur de a ; récupération de l’adresse de b ; récupération de la valeur de b ; calcul de a+b ; récupération de l’adresse de c ; récupération de la valeur de c ; calcul de x ; récupération de l’adresse de x ; stockage de la valeur de x 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM Assembly
  17. Exemple : z = (a << 2) | (b &

    15); ADR  r4,a     LDR  r0,[r4]     MOV  r0,r0,LSL#2     ADR  r4,b     LDR  r1,[r4]     AND  r1,r1,#15     ORR  r1,r0,r1     ADR  r4,z     STR  r1,[r4]   ; récupération de l’adresse de a ; récupération de la valeur de a ; shift de 2 crans (Logical Shift Left) ; récupération de l’adresse de b ; récupération de la valeur de b ; calcul du & ; calcul du| ; récupération de l’adresse de z ; stockage de la valeur de z 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM Assembly
  18. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Exemple : if (i==0) i += 10; • C  :       if  (i  ==  0)  {         i  =  i  +10;       }   • ARM  :       SUBS  R1,  R1,  #0       ADDEQ  R1,  R1,  #10
  19. 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM

    Assembly Exemple : for(i = 0; i < 15; i++) j = j + j • C  :   for  (  i  =  0  ;  i  <  15  ;  i++)  {     j  =  j  +  j;   }   • ARM  :     SUB  R0,  R0,  R0     start     CMP  R0,  #15         ADDLT  R1,  R1,  R1         ADDLT  R0,  R0,  #1         BLT  start ; stocke 0 dans R0 (i) ; teste si i < 15 ; j = j + j ; i++
  20. Exemple final : Calcul du log en base 2 log

          MOV  r2,  #0           MOV  r1,  #-­‐1     log_loop   TST  r0,  #1           ADDNE  r2,  r2,  #1           ADD  r1,  r1,  #1           MOVS  r0,  r0,  LSR  #1           BNE  log_loop           CMP  r2,  #1           MOVEQ  r0,  #1     log_rtn  MOV  pc,lr ; m = 0 ; k = -1 ; teste si LSB(n) == 1 ; m = m+1 si faux ; k = k+1 ; shift : n = n>>1 ; boucle si n != 0 ; teste si m == 1 ; définit R0 à 1 si vrai ; retour 02/01/12 Confidentiel © 2012 Applidium | Focus On : ARM Assembly AREA LOG, CODE, READONLY EXPORT log ; r0 = input : n ; r2 = output : m ; r1 = output : k (n <= 2^k) int  m  =  0;   int  k  =  -­‐1;   while  (n!=0)  {   if(n%2)  {   m  +=  1;   }   k++;   }   m  =  (m==1)  ?  1  :  0;   return  (m,k);