L'octet ModR/M (Mode Registre / Mémoire) permet de déterminer un couple de destination / sources. La destination est forcement un registre par contre la source peut être un registre, une adresse mémoire ou bien une combinaison des valeurs de registres et d'entiers signés donnant une adresse mémoire.
En premier lieu pour déterminer la source nous pouvons nous appuyer sur le tableau ci-après :
registre 8bits (r8) | AL | CL | DL | BL | AH | CH | DH | BH |
registre 16bits (r16) | AX | CX | DX | BX | SP | BP | SI | DI |
registre segment | ES | CS | SS | DS | FS | GS | res. | res. |
Valeur décimale | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
valeur binaire | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
Pour bien comprendre ce tableau il faut savoir que c'est la première colonne et les deux dernières lignes (qui sont la même valeur) qui sont les entêtes du tableau. Cette organisation particulière est voulue car en fait ce tableau servira d'entête de le tableau des destination/sources.
Chaque OpCode par sa nature vous indique si sa destination doit être un registre 8bits, 16bits ou bien un registre segment. La valeur provient de l'octet ModR/M qui peut se découper ainsi :
Destination | |||||||
8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
Mod | R/M |
De ce découpage que les 3 bits du milieu servent pour la destination alors que les 5 autres servent à déterminer la(es) source(s).
registre 8bits (r8) | AL | CL | DL | BL | AH | CH | DH | BH | ||
registre 16bits (r16) | AX | CX | DX | BX | SP | BP | SI | DI | ||
registre segment | ES | CS | SS | DS | FS | GS | res. | res. | ||
Valeur décimale | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
valeur binaire | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | ||
Source | Mod | R/M | Valeur de l'octet ModR/M (en héxa) | |||||||
[BX+SI] | 00 | 000 | 00 | 08 | 10 | 18 | 20 | 28 | 30 | 38 |
[BX+DI] | 001 | 01 | 09 | 11 | 19 | 21 | 29 | 31 | 39 | |
[BP+SI] | 010 | 02 | 0A | 12 | 1A | 22 | 2A | 32 | 3A | |
[BP+DI] | 011 | 03 | 0B | 13 | 1B | 23 | 2B | 33 | 3B | |
[SI] | 100 | 04 | 0C | 14 | 1C | 24 | 2C | 34 | 3C | |
[DI] | 101 | 05 | 0D | 15 | 1D | 25 | 2D | 35 | 3D | |
[disp16] | 110 | 06 | 0E | 16 | 1E | 26 | 2E | 36 | 3E | |
[BX] | 111 | 07 | 0F | 17 | 1F | 27 | 2F | 37 | 3F | |
[BX+SI+disp8] | 01 | 000 | 40 | 48 | 50 | 58 | 60 | 68 | 70 | 78 |
[BX+DI+disp8] | 001 | 41 | 49 | 51 | 59 | 61 | 69 | 71 | 79 | |
[BP+SI+disp8] | 010 | 42 | 4A | 52 | 5A | 62 | 6A | 72 | 7A | |
[BP+DI+disp8] | 011 | 43 | 4B | 53 | 5B | 63 | 6B | 73 | 7B | |
[SI+disp8] | 100 | 44 | 4C | 54 | 5C | 64 | 6C | 74 | 7C | |
[DI+disp8] | 101 | 45 | 4D | 55 | 5D | 65 | 6D | 75 | 7D | |
[BP+disp8] | 110 | 46 | 4E | 56 | 5E | 66 | 6E | 76 | 7E | |
[BX+disp8] | 111 | 47 | 4F | 57 | 5F | 67 | 6F | 77 | 7F | |
[BX+SI+disp16] | 10 | 000 | 80 | 88 | 90 | 98 | A0 | A8 | B0 | B8 |
[BX+DI+disp16] | 001 | 81 | 89 | 91 | 99 | A1 | A9 | B1 | B9 | |
[BP+SI+disp16] | 010 | 82 | 8A | 92 | 9A | A2 | AA | B2 | BA | |
[BP+DI+disp16] | 011 | 83 | 8B | 93 | 9B | A3 | AB | B3 | BB | |
[SI+disp16] | 100 | 84 | 8C | 94 | 9C | A4 | AC | B4 | BC | |
[DI+disp16] | 101 | 85 | 8D | 95 | 9D | A5 | AD | B5 | BD | |
[BP+disp16] | 110 | 86 | 8E | 96 | 9E | A6 | AE | B6 | BE | |
[BX+disp16] | 111 | 87 | 8F | 97 | 9F | A7 | AF | B7 | BF | |
AL / AX | 11 | 000 | C0 | C8 | D0 | D8 | E0 | E8 | F0 | F8 |
CL / CX | 001 | C1 | C9 | D1 | D9 | E1 | E9 | F1 | F9 | |
DL / DX | 010 | C2 | CA | D2 | DA | E2 | EA | F2 | FA | |
BL / BX | 011 | C3 | CB | D3 | DB | E3 | EB | F3 | FB | |
AH / SP | 100 | C4 | CC | D4 | DC | E4 | EC | F4 | FC | |
CH / BP | 101 | C5 | CD | D5 | DD | E5 | ED | F5 | FD | |
DH / SI | 110 | C6 | CE | D6 | DE | E6 | EE | F6 | FE | |
BH / DI | 111 | C7 | CF | D7 | DF | E7 | EF | F7 | FF |
Les disp (displacement) sont des valeurs de 8 ou 16bits accompagnant l'instruction et se trouvant après l'octet ModR/M.
Pour les 8 dernières sources, je suppose que le choix s'effectue suivant la taille du registre de destination mais bon cela reste une supposition.
Je connaissais, mais en mode 32bits.
En effet, sachant que la table pour les architectures 32bits est quelque peu différente de celles des 16bis. De plus en 32bits on peut avoir recours à encore un autre octet, le SIB, pour faire des adressages plus complexes... heureusement que je me concentre que sur de la vieille technologie
Faudra que tu m'expliques comment tu peux concilier IRL, mangas chelous et curiosité informatique plus que poussée. Tu es fou? Tu ne dors pas de la nuit?.. *choqué*
Assez mal en ce moment car le temps passé sur ce projet informatique empiète sur les animes de la semaine que j'ai à voir. D'ailleurs en quoi ces animes (et pas mangas ) sont chelous ? Quand à ma vie sociale... je n'ai pas de vie sociale (encore moins depuis que Ertaï est parti...) par contre je suis loin d'être insomniaque !