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

Intro to ARM Assembly

Intro to ARM Assembly

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);