nohack a écrit :
Salut,jai un pb avec le fonctionnement basique du processeur 8086
|
C'est clair
.
Tout d'abord, il y a deux choses: la structure de l'instruction en machine, et la façon dont le processeur la traite.
La première est déterminée par la compatibilité x86.
La seconde est laissée à la discrétion du fondeur (AMD, Intel, ..) et dépend du modèle. La référence à du microcode dans le cas d'un 8086 pour une ADD AX, [mem] me paraît étrange. A mon avis, c'est du câblé.
Ce qu'on peut faire, c'est dépiauter l'instruction et voir comment le processeur peut exécuter sans ambiguïté ce que le programmeur souhaite.
Il faut de la doc. Celle de Intel est correcte. Pour télécharger, Google ou par exemple:
http://assembleur.maurette.free.fr [...] htm#080804
Voir dans le Vol2, les paragraphes "Instruction Format" (c'est velu) et bien sûr "ADD-Add" dans "Instruction set reference". Une version un peu ancienne peut être plus facile dans notre cas, les instructions x86-64 étant confusantes.
Pour manipuler, si vous avez accès à une machine sous DOS/Windows, vous lancez DEBUG, et vous faîtes:
-a 100
/..../add ax, [115]
/..../[return] |
Puis:
Vous lirez:
0D39:0100 03061501 ADD AX,[0115] |
Ce qui est intéressant, c'est 03061501, qui peut se lire (little endian): 03, 06, 0115
Le µP rencontre d'abord 03. Il sait ainsi qu'il s'agit d'une instruction de type ADD r16, r/m16 (il élimine ADD r32, r/m32 car il est en mode 16 bits)). Ce qui signifie une addition entre un registre cible (inconnu pour l'instant) 16 bits et en opérande soit un registre 16 bits, soit le contenu d'une mémoire 16 bits. Pour en savoir plus, il lit 06. Ce 06, en fait 00-000-110 vu en binaire, il l'interprêtre très facilement, ce qui n'est pas notre cas. En regardant la doc Intel (description du byte ModR/M), on constate que:
- Les 2 premiers bits (Mod) nous situent dans des modes d'adressages "simples".
- Les 3 derniers (R/M) déterminent que l'opérande est en mémoire.
- Les trois du milieu (Reg/Opcode), dont le sens dépend de tout ce qui précède
, nous dit que le registre cible est AX.
Maintenant, le µP en sait assez. Il n'attend plus que les 4 octets de l'offset (dans DS) de la donnée à additionner, qu'il va présenter sur le bus d'adresse pour récupérer la donnée dans l'ALU pour addition.
Ce schéma est à peu près respecté pour un 8086. Un ADD AL, [mem] se fera sans doute en 3 cycles, un ADD AX, [mem] sensiblement plus à cause de l'accès multiplexé.
Sur une version récente, l'instruction à mon avis ne prendra qu'un cycle, et généralement moins au sein du flux d'instructions.
--
Pierre