_dune2_
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011
8 janv. 2007 à 15:19
salut,
Il n'y a aucun soucis pour utiliser des variables 16 bits dans du code 32bits assembleur.
C'est d'ailleur ce que tu fais en utilisant le registre ax :)
à titre d'information :
AH, AL 8bits (AH poids fort AL poids faible)
AX 16bits
EAX 32bits
RAX 64bits (uniquement en mode 64bits appelé em64t chez intel et amd64 chez amd)
tu as donc à dispo (je ne parlerais pas du mode 64bits qui nécéssitent un OS 64bits)
8 "general purpose registers" 32bits :
EAX, EBX, ECX, EDX, ESI, EDI, EBP et ESP (attention toutefois car EBP
et ESP sont utilisé pour la sauvegarde et l'utilisation de l'adresse de
la pile)
8 registres 16bits :
AX, BX, CX, DX, SI, DI,BP et SP (on remarquera que la version 32bits
est une "E"xtension de ces registres 16bits ... et donc toute modif par
exemple de AX, modifie la partie basse 16bits de EAX)
8 registres 8bits :
AH, AL, BH, BL, CH, CL, DH et DL (là encore, ce sont des sous ensembles de AX,BX,CX et DX)
Tu as ensuite des registres appelés SIMD (Single Instruction Multiple Data) 64bits :
MM0 -> MM7 qui sont 8 registres 64bits qui peuvent être segmentés en
8bits, 16bits, 32bits ou 64bits lors des opérations dessus. Attention
aussi sur le fait que ces registre sont "mappé" sur le pile du
coprocesseur arithmétique ... ce qui implique de les nettoyer à la fin
de leur utilisation avec l'instruction "emms" pour avoir un
environnement FPU sain.
Et si ton CPU prend en charge les extensions SSE, tu as aussi 8 registres 128bits supplémentaires:
XMM0 -> XMM7 qui peuvent être segmentés comme les registres MMX mais
avec le double de capacité et indépendant du coprocesseur arithmétique
cette fois-ci (donc pas de restauration du FPU à faire).
Donc pour conclure, oui, tu peux mixer l'utilisation de registres
8/16/32bits dans ton code (c'est même recommandé quand par exemple tu
manipules une chaine de caractère, tu le fais par octets (8bits) et pas
par 32bits ;) sauf pour recopier plus rapidement par paquets de 4
caractères)
Par contre, garde à l'esprit que dans un registre il faut mettre une
donnée cohérente (ex: une adresse -> EAX ou autre 32bits en mode
32bits , ainsi que une adresse -> RAX ou autre 64bits en mode 64bits)
Gentoo... que du bonheur ...