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 :

L'instruction DIV [FAQ]


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 83
    Points : 42
    Points
    42
    Par défaut L'instruction DIV
    Salut à tous
    J'éprouve une difficulté à comprendre l'instruction div, par exemple quand on écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MOV ax,203
    MOV bl,4
    DIV bl
    RET
    cette fonction fait une division entière et met le résultat dans AL (50) et le reste dans AH (3)
    Ce que je ne comprends pas, c'est comment l'instruction DIV peut reconnaître le nombre à diviser du moment que l'opérande ne contient que le diviseur ? Est-ce que ax est utilisé par défaut pour contenir le nombre à diviser ??

    Ca se passe comment s'il vous plaît ?

  2. #2
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Avec 3 versions tu devrais y arriver


    @+WO

    _____________________________________________________________

    DIV
    Usage: DIV src Modifies flags: (AF,CF,OF,PF,SF,ZF undefined)
    Unsigned binary division of accumulator by source.
    Unsigned Integer Divide

    DIV r/m8 ; F6 /6 [8086]
    DIV r/m16 ; o16 F7 /6 [8086]
    DIV r/m32 ; o32 F7 /6 [386]

    DIV performs unsigned integer division. The explicit operand provided is the divisor; the dividend and destination operands are implicit, in the following way:
    For DIV r/m8, AX is divided by the given operand; the quotient is stored in AL and the remainder in AH.
    For DIV r/m16, DX:AX is divided by the given operand; the quotient is stored in AX and the remainder in DX.
    For DIV r/m32, EDX:EAX is divided by the given operand; the quotient is stored in EAX and the remainder in EDX.
    ----------------------------------------------------------------------------

    DIV - Divide
    Usage: DIV src
    Modifies flags: (AF,CF,OF,PF,SF,ZF undefined)
    Unsigned binary division of accumulator by source. If the source
    divisor is a byte value then AX is divided by "src" and the quotient
    is placed in AL and the remainder in AH. If source operand is a word
    value, then DX:AX is divided by "src" and the quotient is stored in AX
    and the remainder in DX.
    Clocks Size

    Operands 808x 286 386 486 Bytes
    reg8 80-90 14 14 16 2
    reg16 144-162 22 22 24 2
    reg32 - - 38 40 2
    mem8 (86-96)+EA 17 17 16 2-4

    mem16 (150-168)+EA 25 25 24 2-4 (W88=158-176+EA)
    mem32 - - 41 40 2-4

    F6 /6 DIV r/m8 Unsigned divide AX by r/m8
    F7 /6 DIV r/m16 Unsigned divide DX:AX by r/m16; AX
    F7 /6 DIV r/m32 Unsigned divide EDX:EAX by r/m32 doubleword
    --------------------------------------------------------------------------

    DIV Unsigned divide O D I T S Z A P C
    ? ? ? ? ? ?

    Opocode Instruction Clocks Description
    F6 /6 DIV r/m8 16/16 Unsigned divide AX by r/m byte (AL=QUO, AH=REM)
    F7 /6 DIV r/m16 24/24 Unsigned divide DX:AX by r/m byte (AX=QUO, DX=REM)
    F7 /6 DIV r/m32 40/40 Unsigned divide EDX:EAX by r/m byte (EAX=QUO, EDX=REM)
    DIV performs an unsigned division. The dividend is implicit; only the divisor is given as an operand. The remainder is always less than the divisor. The type of the divisor determines which registers to use as follows:

    Size Dividend Divisor Quotient Remainder
    byte AX r/m8 AL AH
    word DX:AX r/m16 AX DX
    dword EDX:EAX r/m32 EAX EDX

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 83
    Points : 42
    Points
    42
    Par défaut
    Je pige pas grand chose

    Pourriez vous m'expliquer un peu plus simplement ?

  4. #4
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MOV ax,203 
    MOV bl,4 
    DIV bl
    tu travailles en 16 bits (ax pour eax)
    et 8 bits (bl pour ebx)

    donc ax = 203
    bl = 4

    retour 50 -> ax/4
    reste 3

    rien de bien compliqué (c'est toujours difficile de comprendre ce que mon prochain(e) ne comprend pas


    Tu peux faire en 32 bits

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mox eax 203
    mov ebx 5
    div ebx

    eax = ?
    edx = ?

    tout baigne ?

    @+WO

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 83
    Points : 42
    Points
    42
    Par défaut
    Super je comprends
    (Tu me rectifies si je me trompe WO )

    DIV registre8 ; registre8 est de taille d'un octet
    -->AX est divisé par registre8
    -->quotient dans AL
    -->reste dans AH


    DIV registre16 ;registre16 est de taille deux octets
    -->on divise DX:AX par registre16
    -->quotient dans AX
    -->reste dans DX


    C'est bien ça ?

  6. #6
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    héhé..

    le plus simple c'est de suivre l'état de tes registres dans ton débugeur...

    @+WO

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 83
    Points : 42
    Points
    42
    Par défaut
    Thanks WO

  8. #8
    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
    Bonjour,
    Une petite precision quand meme

    si tu as

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Mov AX,1234
    Mov BL,2
    Div BL
    Tu obtiendra un joli plantage car AX/BL > 8 bits
    le resultat d'une division d'un registre 16 bits, doit tenir dans un registre 8 bits

    Si tu fais une division pax BX, cela veut dire que la valeur initiale doit
    tenir dans un registre 32 bits, et par defaut, ce n'est pas EAX qui
    est utilise mais AX pour le poids faible et DX pour le poids fort
    de meme le resultat sera dans AX et le reste dans DX
    (je ne sais pas si je suis tres clair )

    en resume, si tu as une valeur 16 bits a diviser, il vaut mieux
    la passer en 32 bits et la diviser par une valeur 16 bits

    Exemple, je reprends mon AX=1234 et BX=2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Mov AX,1234
    Mov BX,2
    Cwd (Convert Word in Dword)
    Div BX
    L'instruction CWD recupere le bit de poids fort de AX et remplis DX avec
    Ce qui nous donne une valeur signee
    Si on utilise une valeur non-signee, on peut remplacer CWD par
    Xor DX,DX (par exemple) pour mettre 0 dans DX

    Maintenant, si tu veux effectuer une division 32 bits, par EBX par exemple,
    c'est pareil, la valeur a diviser doit tenir sur 64 bits, et tu as pour
    ca l'instruction CDQ qui transforme EAX en EDX:EAX

    Ouf !!! j'ai fini

    a+ Francois

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 53
    Points : 59
    Points
    59
    Par défaut
    C'est clair, net et précis ^^.
    Et ça mériterais d'être dans la FAQ, le fonctionement de l'instruction div est souvent un mystère pour les débutants.

  10. #10
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 83
    Points : 42
    Points
    42
    Par défaut
    Merciii je comprends parfaitement maintenant, que c'est difficile d'apprendre sans developpez.com !!!!!



  11. #11
    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 content d'avoir pu aider

    a+ Francois

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Instructions division, div-idiv
    Par Array dans le forum x86 32-bits / 64-bits
    Réponses: 19
    Dernier message: 05/08/2011, 14h40
  2. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58
  3. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 19h09

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