Forum Programmation.autre question sur le processeur 8086 et les cycles d'horloge

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
2
29
juil.
2019

Bonjour,

dans les processeurs 8086, en assembleur quand je fais l'intruction sub a,b :
le compilateur va remplacer cette instruction par un not b + inc b + ADD a,b soit 3 cycles d'horloge pour réaliser la soustraction?

De nos jours avec les processeurs actuels, il y a j'imagine pour optimiser la place dans la RAM une seul instruction pour réaliser une soustraction, mais prend elle toujours 3 cycle d'horloge ?

Merci d'avance pour vos éclaircissements.

  • # Source ?

    Posté par  (site web personnel) . Évalué à 3.

    Tu es sûr de toi ? La famille 8x86 est une architecture CISC ça m'étonnerai donc que le compilateur ait besoin de convertir l'opérande comme tu le décris…

  • # Cycles ?

    Posté par  . Évalué à 1.

    Est-tu certain déjà qu'un sub, un not, ou autre, s'exécute en un seul cycle ?
    Ça fait longtemps que je n'ai pas mis le nez là-dedans, mais j'en été resté à une instruction = plusieurs cycles.
    Par contre, il existe tout un tas d'optimisations (pipeline, etc) qui permettent de paralléliser plus ou moins, genre, commencer l'exécution de l'instruction suivante alors que celle en cours n'est pas terminée.

    NB: le 8086 est très loin aussi, mais est-ce que l'instruction sub existe vraiment ?… Sinon, c'est normal qu'il traduise par un négation puis une addition.

  • # je n'y connais pas grand chose en assembleur

    Posté par  . Évalué à 1. Dernière modification le 29 juillet 2019 à 14:33.

    @chimrod, non je n'en suis pas sur du tout. il me semblait que la soustraction d'un nombre binaire se faisait via le complément A2, donc j'imagine que la procédure pour un sub est not + inc + add.

    Justement j'aimerai savoir combien de cycle d'horloge dure un sub, mais je ne connais aucun moyen expérimental pour savoir le nombre de cycle d'horloge pour réaliser une opérande particuliere

    • [^] # Re: je n'y connais pas grand chose en assembleur

      Posté par  (site web personnel) . Évalué à 3.

      Voilà par exemple la conversion d'un petit programme C :

        int i, j = scanf("\d\d\n");
        return i - j;

      qui devient :

      .LC0:
              .string "dd\n"
      main:
              push    rbp
              mov     rbp, rsp
              sub     rsp, 16
              mov     edi, OFFSET FLAT:.LC0
              mov     eax, 0
              call    __isoc99_scanf
              mov     DWORD PTR [rbp-4], eax
              mov     eax, DWORD PTR [rbp-8]
              sub     eax, DWORD PTR [rbp-4]
              leave
              ret

      par contre, pour calculer la longueur en cycle d'horloge, c'est beaucoup plus compliqué. Avec la gestion des pipelines, le temps pris pour exécuter une seule instruction n'a plus beaucoup de sens… Tu pourras trouver quelques informations sur la durée de l'opérande en fonction des paramètres passés ici.

    • [^] # Re: je n'y connais pas grand chose en assembleur

      Posté par  (site web personnel) . Évalué à 3. Dernière modification le 29 juillet 2019 à 20:32.

      il me semblait que la soustraction d'un nombre binaire se faisait via le complément A2

      Oui, mais c'est l'ALU qui le fait, via un jeu de portes logiques. Il n'est pas question là, stricto sensu, de cycles d'horloge.

      D'après la page wikipedia 8086, cela prend trois cycles à l'ALU pour manipuler des registres.

      Justement j'aimerai savoir combien de cycle d'horloge dure un sub, mais je ne connais aucun moyen expérimental pour savoir le nombre de cycle d'horloge pour réaliser une opérande particuliere

      Le plus compliqué, ça va être de trouver une carte avec un 8086 en état de marche pour mesurer ça …

      • [^] # Re: je n'y connais pas grand chose en assembleur

        Posté par  . Évalué à 2.

        Le plus compliqué, ça va être de trouver une carte avec un 8086 en état de marche pour mesurer ça …

        Il est plus efficace de se procurer un « manuel de référence du programmeur ».

        Par exemple avec celui-là : https://edge.edx.org/c4x/.../8086_family_Users_Manual_1_.pdf (premier lien d'une recherche Google avec « intel 8086 programmer's reference manual pdf ») en page 82, il est indiqué qu'une soustraction entre 2 registres prends 3 cycles et que l'instruction occupe 2 octets (la même chose qu'un ADD).

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.