+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Invité de passage
    Homme Profil pro
    Inscrit en
    juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2012
    Messages : 3
    Points : 0
    Points
    0

    Par défaut Rapport instruction SHL AX,1 et Offset

    Bonjour, je débute en assembleur.
    J'ai un livre pour m'aider : ASSEMBLEUR Facile (de Philippe Mercier) qui commence à dater.
    Ci-dessous, le programme écrit à la page 256 du livre (je n'ai pas reproduit tous les commentaires).

    Ma question : je ne comprends pas pourquoi on fait un SHL AX,1



    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    MonProg SEGMENT                         
                ORG 100h
                ASSUME CS:MonProg
    Start:    JMP debut
     
    Table     DW mess0
                DW mess1
                DW mess2
                DW mess3
    mess0    DB 'Ceci est le premier message...$'
    mess1    DB 'Bonjour, comment allez-vous ?$'
    mess2    DB 'bienvenue en France...','$'
    mess3    DB 'ce message émet un beep', 07h,'$'
     
    WRITEMNO PROC NEAR
    PUSH BX,
    PUSH AX,
    MOV AH,0
     
    SHL AX,1                          ;multiplie le num. de message par 2                                ; pour obtenir un offset dans la table
     
    MOVE BX, OFFSET Table
    ADD BX,AX
    MOV DX, [BX]
    MOV AH,09
    INT 21h
    POP AX
    POP BX
    RET
    WRITEMNO ENDP
     
    Debut: MOV AL,0
              CALL WRITEMNO
     
              MOV AL,1
              CALL WRITEMNO
              INT 20h
     
    MonProg ENDS
                END Start
    Merci d'avance,

    Jean-Marc

  2. #2
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 515
    Points : 14 180
    Points
    14 180

    Par défaut

    Bonjour,

    « SHL » signifie « (arithmetical or logical) Shift to the Left ». Il s'agit donc de décaler les bits de AX d'une position vers la gauche. Un zéro est inséré à droite et le bit sortant à gauche est perdu.

    Or, décaler un nombre binaire d'un bit vers la gauche revient à le multiplier par deux, de la même façon que décaler un nombre décimal dans le même sens le multiplie par dix : par exemple, « 15 » → « 150 ».

    En binaire, ça donne par exemple :

    Code :
    1
    2
     1011 -> 11
    10110 -> 22
    Et cette propriété est valable dans toutes les bases.

  3. #3
    Invité de passage
    Homme Profil pro
    Inscrit en
    juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2012
    Messages : 3
    Points : 0
    Points
    0

    Par défaut

    Merci pour ces infos.
    Ma question porte sur l'offset:
    Si on part de l'hypothèse que AX=0.
    Si AX=0, l'offset sera de 0 (SHL AX=1 donnera AX=0 et le ADD BX,AX fera pointer l'offset de Table à 0.
    Puis le MOV AL,1
    SHL AX,1 et donc AX=2
    On ajoute 2 à BX
    Où se trouve l'offset à ce moment là ?
    À offset+2 ?
    Pouvez-vous me donner un exemple vu de la mémoire ?

    Merci,
    Jean-Marc

  4. #4
    Membre Expert
    Avatar de Eric2a
    Homme Profil pro
    Inscrit en
    septembre 2005
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44

    Informations forums :
    Inscription : septembre 2005
    Messages : 1 113
    Points : 1 947
    Points
    1 947

    Par défaut

    Salut,

    Les offsets des différents messages sont mémorisées dans des mots (mess0, mess1, ...) à partir de l'emplacement Table.

     DW mess0 ; Ici est placé l'offset du message mess0
     DW mess1 ; Ici est placé l'offset du message mess1
     etc...
    Etant donné qu'un mot represente deux octets, il est normal de multiplié par deux.

  5. #5
    Invité de passage
    Homme Profil pro
    Inscrit en
    juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2012
    Messages : 3
    Points : 0
    Points
    0

    Par défaut Merci

    Merci pour toutes ces informations très utiles !

    Jean-Marc

  6. #6
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 515
    Points : 14 180
    Points
    14 180

    Par défaut

    De rien mais la prochaine fois, n'oublie pas le bouton en bas de page.
    Bonne chance.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •