Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Pourquoi 3 instructions pour réaliser une soustraction


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 270
    Points : 56
    Points
    56
    Par défaut Pourquoi 3 instructions pour réaliser une soustraction
    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.

  2. #2
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 2 695
    Points : 8 274
    Points
    8 274
    Par défaut
    Le x86 c'est très vaste , ça va du Intel 8086 , aux Intel DX4 , aux pentium et aux i9 actuelle.
    Si on parle du Intel 8086 (et je me demande pourquoi un proc intel cadencé à 5 Mhz sorti en 1978 t'intéresse) , il avait en moyenne 15 cycles par instructions
    (c'est une moyenne , evidamment les opérations registre,registre étant souvent le plus rapide , et ceux accès à la mémoire les plus lentes)

    Si on parle d'un proc actuelle (et techniquement les procs qui date d’après 1995) alors tu ne pas prédire le nombre de cycle pour les procs Intel , cela dépend de plein de paramètre (de la pipeline , du cache entre autre).
    Un proc intel actuelle est capable de faire 5 instructions/cycle mais c'est un chiffre idéal , ça peut être beaucoup moins en pratique.

    Et sinon non l'instruction sub existe bel et bien pour le 8086 et tout les autres gros proc de l'époque (le M68000 , 6502 et le z80) avait cette opération basique , c'est pas une feature moderne
    Il avait aussi l'instruction mul et div aussi
    Donc si t'as un assembleurs qui remplace ton sub par 3 instructions , change d'assembleurs

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    11 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 11 746
    Points : 26 260
    Points
    26 260
    Par défaut
    Donc si t'as un assembleurs qui remplace ton sub par 3 instructions , change d'assembleurs
    C'est peut-être une optimisation. Il est peut-être plus rapide de faire un complément à 2 pour remplacer une soustraction en addition. Un peu comme le fameux xor eax,eax plus rapide que mov eax,0.
    les x86 ont un nombre variable de cycles pour leurs instructions, faire 3 opérations peut prendre moins de cycles qu'une seule selon les instructions utilisées.

    Autre exemple faire une division est très couteux, pour diviser par 4, plutôt que d'utiliser l'opcode div, on va décaler les bits d'un registre de deux rangs vers la droite, ça marche aussi pour la multiplication en décalant vers la gauche, décaler d'un bit va multiplier ou diviser par 2 (opération uniquement valable pour les multiples de 2).

    Donc si t'as un assembleurs qui remplace ton sub par 3 instructions , change d'assembleurs
    le compilateur va remplacer cette instruction

    Si ton code assembleur est généré par un compilateur, tu peux avoir une représentation différente de ce que tu aurais fait directement en assembleur mais équivalente. Et comme signalé par Kannagi, il faut tenir compte du pipeline, du cache. Le compilateur peut donc faire la même chose différemment selon le contexte.

    Les instructions add, sub, mul, div sont présentes dans le x86. Les processeurs RISK ne comportent en général par d'instruction de division.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. Quel design pattern pour réaliser une synthèse
    Par jbwan dans le forum Design Patterns
    Réponses: 3
    Dernier message: 21/04/2006, 13h39
  2. Réponses: 2
    Dernier message: 22/01/2006, 02h11
  3. Réponses: 3
    Dernier message: 23/12/2005, 15h48
  4. Réponses: 8
    Dernier message: 03/11/2005, 09h51
  5. question pour réaliser une pagination
    Par vbcasimir dans le forum Langage
    Réponses: 1
    Dernier message: 13/10/2005, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo