IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Les fonctions mathématiques


Sujet :

x86 16-bits Assembleur

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Points : 0
    Points
    0
    Par défaut Les fonctions mathématiques
    Bonsoir

    j'ai cette fonction mathématique : y= (4x²+3x)/(2x-7)
    Par exemple, on pose x = 3
    Je tente d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    mov al,3
    mul al
    mov bl,4
    mul bl
    mov cl,al
    mov al,3
    mov bl,3
    mul bl
    add al,cl
    mov cl,al
    mov al,3
    mov bl,2
    mul bl
    sub al,7
    mov bl,al 
    mov ax,cl
    div bl
    je ne suis pas sûr du programme correct , et je pense qu'il est trop long !!

  2. #2
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    ça fonctionne presque
    mov ax,cl ne peut pas fonctionner (registre 8 bits dans un registre 16 pas possible)
    par contre, tu peux faire :
    cbw transforme al en ax en conservant le signe

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Algérie

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2015
    Messages : 8
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Forthman Voir le message
    ça fonctionne presque
    mov ax,cl ne peut pas fonctionner (registre 8 bits dans un registre 16 pas possible)
    par contre, tu peux faire :
    cbw transforme al en ax en conservant le signe
    ohh merci , j'ai peux la sténographie ?? je vois que le code est trop long !!

  4. #4
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Citation Envoyé par hamelum Voir le message
    ohh merci , j'ai peux la sténographie ??
    euh.... j'ai pas compris la question

    je vois que le code est trop long !!
    Tu peux gagner quelques lignes en jouant un peu plus avec les registres, mais ça ne fera pas de miracle

  5. #5
    Membre éclairé

    Homme Profil pro
    Rédacteur technique (retraité)
    Inscrit en
    Octobre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Rédacteur technique (retraité)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 168
    Points : 807
    Points
    807
    Par défaut
    Bonjour,

    Je crains que le code proposé par hamelum ne comporte un bug plus grave que celui signalé par Forthman et qui lui ne serait pas détectable à la compilation.

    En effet, étant posé que X = 3, la valeur du diviseur soumis à la dernière division (2x-7) sera égal à -1 (2 fois 3 = 6, moins 7 = -1). Celà nous impose clairement une logique d'arithmétique SIGNÉE. Or l'instruction DIV ne convient que pour l'arithmétique NON Signée.
    Le résultat sera faux.

    Il faudrait à la place utiliser l'instruction IDIV qui elle présume que ses opérandes sont signés.

    Rappel pour les débutants :
    Le processeur ne peut en aucune façon savoir si un registre contient une valeur signée ou non signée. C'est au programmeur qu'il appartient d'utiliser les bonnes instructions pour l'un ou l'autre cas.

    Une remarque similaire est à formuler pour les instructions MUL/IMUL si l'on veut pouvoir traiter des valeurs de X négatives.

    J'ajouterais ensuite que ce n'est pas une bonne idée d'avoir représenté X par des constantes immédiates. La valeur X est fixée "en dur" dans le code et ne permet pas de calculer la fonction pour d'autres valeurs sans devoir modifier le source et recompiler le tout.

    Enfin le parti-pris de n'utiliser pratiquement que des registres 8 bits va conduire très vite à des erreurs par troncature lors des calculs intermédiaires si on pose des valeurs de X un peu plus grandes (par exemple pour X = 8, la valeur intermédiaire pour 4x² vaudra 256, incodable sur 8 bits).

  6. #6
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    bien vu pour idiv ! j'avais pensé au signe en proposant cbw (au lieu de mettre AH à 0 )
    mais j'ai zappé la division qui suivait

    pour le reste (taille des registres, utilisation de variable pour 'x') je suis parti du principe qu'il avait
    du faire avec ce qu'il avait vu en cours.

    On va pas tout lui dire, faut le laisser un peu chercher (et revenir par la même occasion)

Discussions similaires

  1. les fonctions mathématique de VB.Net
    Par vb.net.2008 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/11/2008, 23h43
  2. [Débutant] Les fonctions mathématiques en Fortran
    Par feynman dans le forum Fortran
    Réponses: 1
    Dernier message: 17/07/2007, 10h21
  3. Réponses: 24
    Dernier message: 30/05/2007, 18h29
  4. Réponses: 7
    Dernier message: 24/05/2003, 15h56
  5. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19

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