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 :

Registre et mémoire


Sujet :

x86 16-bits Assembleur

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Registre et mémoire
    salut tout le monde
    je me bloque sur l'exercice suivant:
    étant donner le programme suivant remplissez le contenu des registres du microprocesseur 8086 et la mémoire RAM après l’exécution de tout le programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    org 100h
    Mov AL, 12h
    Mov[213h], 40h
    Div [213h]
    ADD AL, AH
    MOV BX, 23h
    MUL BX
    MOV [200h]
    MOV [202h], DX
    je veux que quelqu'un m'explique le principe s'il vous plait

    je viens de débuter le langage assembleur voilà ce que j'ai fais en tout cas
    on travaille sur des registres 8 bits donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    org 100h
    Mov AL, 12h;AL=12h
    Mov[213h], 40h;[213h]=40h
    Div [213h];12h / 40h , 00h->AL , 12h->AH
    ADD AL, AH; Ah=AL+AH=00h+12h=12h
    MOV BX, 23h;BX=23h
    MUL BX
    MOV [200h], AX
    MOV [202h], DX
    et merci

  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
    bonjour,

    registres 8 et 16 bits plutôt,
    dans la première division il n'y a rien qui informe sur la taille de l'opérande en mémoire
    par défaut le compilateur considère que c'est du 16 bits (si le processeur utilisé est un 8086)
    De plus lors d'une division, le dividende doit faire deux fois la taille du diviseur
    donc AH doit être initialisé (avec 0 ici)

    ADD AL,AH veut dire AL=AL+AH donc AX n'est pas = à 12h

    L'avant dernière instruction est incomplète, j'imagine que c'est MOV [200],AX

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Salut Forthman
    Oui il y a un AX que j'ai oublié devant le [200h]
    je pense que j'ai compris le principe
    rectifie moi si je me trompe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    org 100h
    Mov AL, 12h;AL=12h,AH=00h et AX=AL=12h
    Mov[213h], 40h;[213h]=0040h on travaille sur 16 bits puisque c'est pas précisé
    Div [213h];division du contenu de DX:AX par l'opérande 16 bits, le 
    ;quotient est dans AX, le reste dans DX donc AX=12h/40h=00H,DX=12h
    ADD AL, AH;AL=00h
    MOV BX, 23h;BX=23h
    MUL BX;AX=BX*AX=00h
    MOV [200h],AX;[200h]=0000h
    MOV [202h], DX;[202h]=0012h
    récapitulons
    le contenu des registres à la fin de l’exécution
    AX:AH=00h|AL=00h
    BX:BH=00h|BL=23h
    DX: DH=00h|DL=12h
    CX:CH=00h|CL=00h
    le contenu des mémoires à la fin de l’exécution
    [200h]=0000h
    [202h]=0012h
    [213h]=0040h

  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
    C'est logique.

    Sauf que si la valeur 32 bits composée de DX:AX n'est pas initialisée,
    il y a de fortes chances que ces derniers ne soient pas à 0
    et si DX >= 40h, alors le résultat ne tiendra pas dans les 16 bits de AX.
    Et dans ce cas le proc déclanche une erreur "division par zéro"

    Si c'est ton prof qui t'a donné ce code, tu peux lui dire qu'il est naze

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Je te remercie infiniment pour ton aide

    Je pense que je vois un peu plus clair
    mais juste un question si les registres ne sont pas initialisés comme dans ce cas
    est ce qu'il faut les prendre à 00H pour les 8bits ou 0000h pour les 16 bits

    oui c'est un exercice donné par le prof

  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
    S'il ne sont pas initialisés, ils peuvent avoir n'importe quelle valeur d'où le problème
    mais j'imagine que pour ton exemple, il faut considérer qu'ils sont à 0

  7. #7
    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 à tous...

    Citation Envoyé par Forthman Voir le message
    Si c'est ton prof qui t'a donné ce code, tu peux lui dire qu'il est naze
    C'était peut-être intentionnel de sa part afin de faire prendre conscience à ses étudiants de l'importance des spécifications de taille d'opérande, spécialement lorsqu'aucun registre n'est explicitement spécifié.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Mov[213h], 40h
    Div [213h]
    Pour le MOV, rien n'indique si la constante immédiate représente un Byte (Mov 8 bits) ou un Word (Mov 16 bits) la destination n'étant pas une spécification de registre, ni une référence à une position mémoire typée.

    De même pour la division rien n'indique si on veut faire une division avec résultat sur 8 bits (AL et AH) ou sur 16 bits (AX et DX).

    Se fonder pour faire la différence sur d'éventuels comportements par défaut du logiciel assembleur est selon moi une erreur car ces comportements ne font pas l'objet de Normes officielles strictes et peuvent varier d'un logiciel à l'autre.

Discussions similaires

  1. contenu registre et mémoire
    Par speedstar dans le forum x86 32-bits / 64-bits
    Réponses: 0
    Dernier message: 06/02/2014, 20h51
  2. Mémoire FIFO, registre Full
    Par Zirka dans le forum Simulink
    Réponses: 0
    Dernier message: 03/08/2010, 14h29
  3. [Windows]accès base de registre windows
    Par Greg01 dans le forum API standards et tierces
    Réponses: 27
    Dernier message: 05/06/2007, 15h14
  4. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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