![]() Page réalisée par: Philippe Moreau UPJV |
Lorsque l'on consulte un ouvrage traitant d'un microprocesseur, on trouvera également le moyen d'assembler les lignes de code (qui rappelons-le sont écrites en "clair"). C'est à dire le moyen de trouver le codage de l'instruction afin qu'elle soit compréhensible par le micro-processeur. Pour cela, on a besoin de conna”tre le format sur lequel l'instruction est codée (ici c'est en général 16 bits) puis les modes d'adressages autorisés avec les codes associés. On pourra alors en déduire le codage final qui, suivant les modes d'adressages utilisés sera complété par d'autres valeurs (données ou adresses).
Ainsi si on observe l'instruction ADD, voici ce que l'on pourra trouver :
Le format de l'instruction ADD est le suivant :
- Ce mot de 16 bits sera éventuellement suivi d'autres informations suivant les modes d'adressages utilisés (exemple les adresses lors de l'absolu et les valeurs pour l'adressage immédiat).
Revenons maintenant sur les 16 premiers bits et les valeurs que l'on doit leur attribuer.
Mode d'adressage | Mode | Register | Mode d'adressage | Mode | Register | |
---|---|---|---|---|---|---|
Dn | 000 | N° Registre | D(An,Xn) | 110 | N° Registre | |
An | 001 | N° Registre | Abs.W | 111 | 000 | |
(An) | 010 | N° Registre | Abs.L | 111 | 001 | |
(An)+ | 011 | N° Registre | D(PC) | 111 | 010 | |
-(An) | 100 | N° Registre | D(PC,Xn) | 111 | 011 | |
D(An) | 101 | N° Registre | Imm | 111 | 100 |
Mode d'adressage | Mode | Register | Mode d'adressage | Mode | Register | |
---|---|---|---|---|---|---|
Dn | - | - | D(An,Xn) | 110 | N° Registre | |
An | - | - | Abs.W | 111 | 000 | |
(An) | 010 | N° Registre | Abs.L | 111 | 001 | |
(An)+ | 011 | N° Registre | D(PC) | - | - | |
-(An) | 100 | N° Registre | D(PC,Xn) | - | - | |
D(An) | 101 | N° Registre | Imm | - | - |
Dans le cas des adressages absolu ou immédiat on trouvera les valeurs (adresse ou données) après les 16 bits.
Ainsi la ligne de code :
ADD.W | #$F85,D1 | pourra se coder par les mots : D27C 0F85 |
Remarque (truc et astuce)
Si dans un programme on trouve les lignes suivantes :
MOVE | #$5588,D0 | ||
DC.W | $641,$F85,$103C,5 |
On trouvera dans D1 la valeur $F85 sur 16 bits (si celui-ci contenait 0) et D0 contiendra $5505 sur 16 bits.
En effet les lignes précédentes correspondent aux codes de :
MOVE | #$5588,D0 | ||
ADDI.W | #$F85,D1 | ||
MOVE.B | #5,D0 |
Exemple : l'adressage indirect avec index et déplacement d8(An,Xm)
- Lors du développement d'un logiciel graphique, vous souhaitez pouvoir manipuler des objets 3D définis par des sommets (et des arêtes). On suppose que les sommets sont stockés à partir de l'adresse OBJ sous la forme X0,Y0,Z0,X1,Y1,Z1 ,X2 ,Y2 ,Z2 ,X3 ,Y3 ,Z3 , etc...
MOVE.L | #OBJ,A0 | ||
MULU | #6,D0 | ||
MOVE.W | 0(A0,D0),X | pour récupérer dans X la coordonnée en X du point | |
MOVE.W | 2(A0,D0),Y | pour récupérer dans Y la coordonnée en Y du point | |
MOVE.W | 4(A0,D0),Z | pour récupérer dans Z la coordonnée en Z du point |
Actions exactes de JSR et RTS
JSR | TOTO |
S'assemblera sous la forme JSR $xxxxxx
Et on réalise :
-(SP) ← PC ; PC ← '$xxxxx' |
On stocke le contenu actuel du registre PC sur la pile (à ce moment, PC contient l'adresse de l'instruction qui suit JSR) et on met dans le registre PC l'adresse donnée par TOTO). Au passage, on remarque que la pile est positionnée au "fond" de la mémoire et "croît" en revenant vers le début de mémoire.
et pour | RTS |
on va réaliser :
PC ← (SP)+ |
On récupère l'adresse qui se trouve sur la pile (que l'on met dans le registre PC, et donc le programme continuera à cette adresse) et on repositionne le pointeur de pile (SP).