Décalage de n bit dans ARM

Décalage de n bit dans ARM - ASM - Programmation

Marsh Posté le 17-01-2008 à 21:12:12    

Bonjour a tous
 
La fonction suivante fait un décalage de n bit dans un mot de 64 bits
 

Code :
  1. typedef long long Word64;
  2. static inline Word64 sar64(Word64 valeur, int nb)
  3. { int temoin,b;
  4.   Word64 provisoir;
  5.   unsigned int poidfort,poidfaible;
  6.    provisoir=valeur;
  7.    provisoir>>=32;
  8.    poidfort=(int)provisoir;
  9.  
  10.    provisoir=valeur;
  11.    poidfaible=(int)provisoir;
  12.  
  13.  
  14.  
  15. nb &= 0x3F; // prudence : pas plus de 63 décalages
  16. for(b = 0; b < nb; b++)
  17. {
  18.  temoin = poidfort & 0x00000001;
  19.  poidfort >>= nb;
  20.  poidfaible >>= nb;
  21.  poidfaible |= temoin;
  22.                          
  23. }
  24.        
  25.        
  26.         provisoir=0;
  27.         provisoir=poidfort;
  28.         provisoir<<=32; 
  29.         provisoir+=poidfaible;
  30.    
  31.         return provisoir;
  32. }


 
Pouvez vous m'aider a traduire cette fonction en assembleur ARM9
 
Merci d'avance

Reply

Marsh Posté le 17-01-2008 à 21:12:12   

Reply

Marsh Posté le 17-01-2008 à 23:00:21    

Peux-tu nous donner plus de précision sur la partie à traduire qui te pose problème ? [:opus dei]

Reply

Marsh Posté le 18-01-2008 à 17:42:20    

Elmoricq a écrit :

Peux-tu nous donner plus de précision sur la partie à traduire qui te pose problème ? [:opus dei]


 
Je maitrise pas bien l'assembleur ARM, disons que la boucle est la partie la plus difficile dans ce code.


Message édité par doomtn le 18-01-2008 à 17:43:24
Reply

Marsh Posté le 19-01-2008 à 16:05:10    

bin déjà c'est pas vraiment de l'assembleur là hein
 
je connais pas spécialement l'archi arm et ses variantes (si y'en a)
 
bon si le compilo supporte l'émulation d'opération 64bits sur ton cpu 32bits, juste le >> pourrait marcher. (donc déjà vérifier avant de hacker, ça permetterra de pas faire une contre-performance pour un cpu 64bits)
 
--
 
ensuite avec quelques shifts et des masques ça devrait marcher.  
 
à l'arrache pour un shift arithmétique droit de n bits (stune proposition):
 
- shift droit de n bits des 32bits bas (sans extension de signe),  
 
- si n<32
  shift gauche de 32-n bits des 32bits haut puis ou logique du résultat temporaire avec les 32bits bas
 
- si n>32
  shift droit de n-32 bits des 32bits haut (avec extension de signe) puis ou logique du résultat temporaire avec les 32bits bas
 
- shift droit de n bits 32bits haut (extension de signe)
 
voilà donc après y'a ptet moyen de faire mieuxe (déjà ptet faire des combinaisons de masques pour dégager les comparaisons)

Reply

Marsh Posté le 01-02-2008 à 19:40:14    

Tutoriel sur l'assembleur ARM:
http://www.heyrick.co.uk/assembler/
ça peut peut-être t'aider.
 
ex: MOV R0, R1, LSR R2  
fait l'équivalent du C: R0 = R1 >> R2
 
Et puis il n'est pas inutile de lite ce tutoriel pour savoir comment sont alloués et utilisés les registres ARM:
 

Code :
  1. User Mode  SVC Mode   IRQ Mode   FIQ Mode  APCS
  2. R0 ------- R0 ------- R0 ------- R0        a1
  3. R1 ------- R1 ------- R1 ------- R1        a2
  4. R2 ------- R2 ------- R2 ------- R2        a3
  5. R3 ------- R3 ------- R3 ------- R3        a4
  6. R4 ------- R4 ------- R4 ------- R4        v1
  7. R5 ------- R5 ------- R5 ------- R5        v2
  8. R6 ------- R6 ------- R6 ------- R6        v3
  9. R7 ------- R7 ------- R7 ------- R7        v4
  10. R8 ------- R8 ------- R8         R8_fiq    v5
  11. R9 ------- R9 ------- R9         R9_fiq    v6
  12. R10 ------ R10 ------ R10        R10_fiq   sl
  13. R11 ------ R11 ------ R11        R11_fiq   fp
  14. R12 ------ R12 ------ R12        R12_fiq   ip
  15. R13        R13_svc    R13_irq    R13_fiq   sp
  16. R14        R14_svc    R14_irq    R14_fiq   lr
  17. ------------- R15 / PC -------------       pc


 
En gros tu as 4 registres généraux de données et 4 registres généraux d'adresses, les autres ayant certaines contraintes dépendant du mode (user ou kernel ou interruption matériel).
Dans le détail, les assembleurs se ressembles tous un peu, superficiellement, dans leurs principes, mais avec de grosses différences dans les instructions supportées et modes d'adressage. Ce qu'il faut retenir c'est qu'il n'est pas nécesssaire de faire des décalages bit par bit, quand l'ARM a un barrel shifter générique utilisable dans presque toutes les instructions arithmétiques et de déplacement de registre ou de chargement en mémoire pour calculer des adresses facilement.
 
Sinon revois ton code C de simulation il est très inefficace. Si on suppose que ton compilo supporte les types 64 bits (long long) il va passer les paramètres 64 bits dans 2 registres 32 bits (par exemple R4 et R5). Regarde déjà ce que génère gcc dans une sourtie en source assembleur (.s).


Message édité par verdy_p le 01-02-2008 à 19:58:27
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed