mardi 14 mai 2019

Chapitre 58 : différence de l'assembleur entre le PI 1 et le PI 3


Tous les chapitres précédents ont été écrits pour la programmation en assembleur pour le Raspberry pi modèle 1.  Pour programmer en assembleur ARM 64 bits, j’ai acquis un raspberry pi3 B+ mais hélas je ne peux pas écrire de programmes en 64 bits car la version Linux Raspbian Jessie ne gère que le 32 bit. En attendant de réussir à faire fonctionner des versions Linux 64 bits sur le raspberry pi 3, j’ai testé certains programmes des chapitres précédents écrits en 32 bits.
Déjà les outils de compilation et de lien restent identiques pour les 2 modèles.
Par contre  l’adresse de base du GPIO est différente : 0x 3F003000 à la place de 0x20003000. Et pour ceux qui veulent utiliser la mailbox l’adresse est 0x40000000.
Au niveau des instructions, nous trouvons l’instruction de division signée sdiv et non signée udiv. Ces instructions ne donnent que le quotient de 2 nombres de 32 bits. Pour avoir le reste il faut multiplier ce quotient par le diviseur et l’enlever du dividende !! Mais cela est fait grâce à la seule instruction  mls, exemple :

    mov r2,#105   @ dividende
    mov r1,#10    @ diviseur
    udiv r0,r2,r1 @ calcul quotient dans r0
    mls r3,r1,r0,r2  @ calcul reste dans r3

Sur le raspberry pi 1, il n’était possible que de mettre des valeurs immédiates de 0 à 255 et des multiples de 4, 8, 16 et 32 de ces valeurs. Il fallait donc utiliser une instruction de chargement ldr pour charger dans un registre les autres valeurs. Sur le Raspberry pi 3, il est possible de charger tous les valeurs de 0 à 0xFFFF (0 à 4095) dans la partie basse d’un registre avec l’instruction mov puis de charger toutes les valeurs de 1 à 0xFFFF dans la partie haute grâce à l’instruction movt.
Par exemple pour charger la valeur 0xCCCCCCCD dans le registre r0 il faut effectuer :
Mov r0, #0xCCCD
Movt r0,#0xCCCC
Curieusement et bien que la documentation l’indique, il n’est pas possible d’additionner ou de soustraire une valeur dans la plage 0-4095.
Nous trouvons aussi l’instruction rbit qui permet d’intervertir les 32 bits d’un registre.
Et une curieuse instruction IT (IF Then) dont je n’ai pas bien compris la logique et l’utilité !!

Si je trouve d’autres différences, je compléterais ce post.

Aucun commentaire:

Enregistrer un commentaire