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 :
- User Mode SVC Mode IRQ Mode FIQ Mode APCS
- R0 ------- R0 ------- R0 ------- R0 a1
- R1 ------- R1 ------- R1 ------- R1 a2
- R2 ------- R2 ------- R2 ------- R2 a3
- R3 ------- R3 ------- R3 ------- R3 a4
- R4 ------- R4 ------- R4 ------- R4 v1
- R5 ------- R5 ------- R5 ------- R5 v2
- R6 ------- R6 ------- R6 ------- R6 v3
- R7 ------- R7 ------- R7 ------- R7 v4
- R8 ------- R8 ------- R8 R8_fiq v5
- R9 ------- R9 ------- R9 R9_fiq v6
- R10 ------ R10 ------ R10 R10_fiq sl
- R11 ------ R11 ------ R11 R11_fiq fp
- R12 ------ R12 ------ R12 R12_fiq ip
- R13 R13_svc R13_irq R13_fiq sp
- R14 R14_svc R14_irq R14_fiq lr
- ------------- 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