Précédent   Forum du club des développeurs et IT Pro > Autres langages > Assembleur > x86 16-bits
x86 16-bits Architecture x86 16 bits et ses outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/07/2012, 21h04   #1
heatseeker
Invité de passage
 
Homme
Inscription : 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
heatseeker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2012, 23h27   #2
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 612
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 612
Points : 11 082
Points : 11 082
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.
Obsidian est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2012, 14h34   #3
heatseeker
Invité de passage
 
Homme
Inscription : juillet 2012
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : juillet 2012
Messages : 3
Points : 0
Points : 0
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
heatseeker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2012, 15h01   #4
Eric2a
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 094
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 42

Informations forums :
Inscription : septembre 2005
Messages : 1 094
Points : 1 648
Points : 1 648
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.
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2012, 15h44   #5
heatseeker
Invité de passage
 
Homme
Inscription : 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
heatseeker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2012, 17h47   #6
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 612
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 612
Points : 11 082
Points : 11 082
De rien mais la prochaine fois, n'oublie pas le bouton en bas de page.
Bonne chance.
Obsidian est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h45.


 
 
 
 
Partenaires

Hébergement Web