Base Assembleur

De UnixWiki
Aller à la navigation Aller à la recherche
   NOP 	4 Bytes	opcode: 0x60000000 	(extended opcode for ori r0,r0,0) # NO_Operation
   li r4,456 # étend la valeur 456 défini sur 16bit dans le registre r4 en 32bit.(load immediate) 
mr r4,r5 # copie de registre 32bit source r5 vers un registre destination r4 . (Move Register)
lbz r5,decalage (r6) # lit valeur 8 bit a l'adresse pointé par r6+decalage dans r5 et les 24 bit de poid fort sont mis à zero. (8 bit non signé)
lba r5,decalage (r6) # pareil mais les 24 bit fort sont étendu par le signe.(8 bit signé)
lhz r5,decalage (r6) # lit une valeur 16bits vers 32 bits, en temps que non-signé.(load half and zero)
lha r5,decalage (r6) # lit une valeur 16bits vers 32 bits, en temps que signé.(load half algebraic)
lwz r5,decalage (r6) # lit valeur 32 bit a l'adresse pointé par r6+decalage (load word and zero)

(note importante: dans le cas de lwz sur une ABI 32bit, le 'z' s'adresse au 32 bit non implémenté, et 'lwa' n'a pas de sens.)

   lwzx r5,r6,r7 # comme lwz, mais l'adresse lue est donné par r6+r7 
lwzu r5,decalage (r6) # comme lwz, mais aprés r6 = r6 + decalage
lwzux r5,r6,r7 # comme lwzx, mais ensuite r5 = r6 + r7.
lfs f0,decalage (r6) # lecture d'un float 4 octets dans le registre flottant f0.
lfd f0,decalage (r6) # lecture d'un float double 8 octets.
stb r5,decalage (r6) # écrit l'octet de poid faible de r5 à l'adresse r6+decalage.(store byte)
stw r5,decalage (r6) # écrit les 32 bits de poid faible à l'adresse r6+decalage.(store word)
stfsux ... # devinez !

Pourquoi ces noms si complexes et incompréhensibles ?

Explication: les noms des mnémoniques PPC sont les initiales de la phrase décrivant leurs actions:

Toutes les instructions commençant par 'l' (load) chargent depuis la mémoire vers un registre. (à part li, load immédiate) Toute celles commençant par 'st' (store) écrivent la mémoire. Suit ensuite le format déplacé: en PowerPC le vocabulaire n'est pas le même qu'en 68000: les 'mots' PowerPC (word) font 4 octets (2 en 68k.) mais ce n'est qu'une question de convention et de vocabulaire. On a:

   b (byte) 1 octet.
   h (half) entier 2 octets
   w (word) entier 4 octets
   fs flottant 4 octet IEEE
   fd flottant double 8 octet IEEE 

Ensuite viennent les lettres d'option de la copie:

   'z' aprés un 'l' signifie que les bits de poids fort du registre sont mis à 0 (cas d'un entier non signé, sauf lwz cas particulier.)
   'a' remplace z pour étendre le signe pour les nombres signé.
   'i' pour immédiate, valeur donné dans l'instruction.
   'x' pour 'indexed' indique que qu'on additionne 2 registres pour trouver l'adresse à lire.
   'u' pour 'update' indique que le pointeur utilisé va être incrémenté aprés la copie.( (a0)+ en 680x0 )
   '.' Ne marche pas pour les load et les stores mais pour les opérations de calcul et logique: indique optionellement si l'instruction doit mettre à jour 

le registre d'état cr0 dont les bits indiquent les dépassements et l'égalité à 0, pour un prochain test.