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 32-bits / 64-bits Assembleur Discussion :

Registres se comportant comme des pointeurs


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut Registres se comportant comme des pointeurs
    Bonjour à tous,

    Extrait de Carter:"
    L’adressage indirect permet aux registres de se comporter comme des pointeurs. Pour indiquer qu’un registre est utilisé indirectement comme un pointeur, il est entouré par des crochets ([]). Par exemple :
    1 mov ax, [Data] ; adressage mémoire direct normal d’un mot
    2 mov ebx, Data ; ebx = & Data
    3 mov ax, [ebx] ; ax = *ebx
    Comme AX contient un mot, la ligne 3 lit un mot commençant à l’adresse stockée dans EBX. Si AX était remplacé par AL, un seul octet serait lu.
    Il est important de réaliser que les registres n’ont pas de types comme les
    variable en C. Ce sur quoi EBX est censé pointer est totalement déterminé
    par les instructions utilisées.
    "

    1-Je suppose que Data est l'adresse d'une variable texte? array[0] en C? Pourquoi entre crochets?
    2-Place l'adresse de Data array[0] ? pas de pointeur?


    Cordialement,

    L'incompreneur.
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    "Data" est en fait un emplacement en mémoire
    Les variables ça n'existe pas en assembleur, c'est juste un concept

    Dans ton programme il existe un emplacement qui s'appelle "Data" et à cet emplacement peut se trouver un nombre, un texte, etc. (seul le programmeur le sait)

    Quand tu écris "mov ebx, Data" eh bien ça place l'adresse mémoire de cet emplacement dans ebx

    C'est comme si tu avais une fonction qui s'appelle "Fonction"
    "mov ebx, Fonction" mettrait l'adresse mémoire de l'emplacement de la fonction dans ebx


    Ecrire [Data] (entre crochets) permet de dire qu'on veut accéder à ce qui se trouve à cet emplacement, c'est-à-dire le nombre, texte, etc. qui s'y trouve

  3. #3
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par Tomaka17 Voir le message
    Ecrire [Data] (entre crochets) permet de dire qu'on veut accéder à ce qui se trouve à cet emplacement, c'est-à-dire le nombre, texte, etc. qui s'y trouve
    1 mov ax, [Data] ; adressage mémoire direct normal d’un mot
    3 mov ax, [ebx] ; ax = *ebx

    Est-ce que 1 veut dire la même chose que 3?
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par J4e8a16n Voir le message
    1 mov ax, [Data] ; adressage mémoire direct normal d’un mot
    3 mov ax, [ebx] ; ax = *ebx

    Est-ce que 1 veut dire la même chose que 3?
    Oui

    À condition bien sûr que tu aies fait auparavant :
    mov ebx, Data

  5. #5
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    D'accord.
    MOV BYTE PTR [SI],90 ; ?


    Maintenant:

    char * mot = "mot"; en C
    OU
    String mot = "mot"; en Java

    Comment l'identifiant String ou char, s'expriment-t-ils en assembleur?

    Je sais qu'il n'y a que des 0-1. Si je place
    1 mov ax, [Data] ; adressage mémoire direct normal d’un mot
    Il n'y a que moi qui sache que c'est un texte. Comment est-ce que je me le dit en assembleur sans ajouter
    ; adressage mémoire direct normal d’un mot
    ?


    Je ne sais pas si je me fais comprendre :-)

    JPD
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par J4e8a16n Voir le message
    D'accord.
    MOV BYTE PTR [SI],90 ; ?
    Ça veut dire que tu vas déposer la valeur 90 dans l'octet pointé par SI. Tu es obligé de mettre BYTE PTR parce que, contrairement à un registre, on ne sait pas a priori quel est le format de « 90 » (8 bits, 16 bits, ...).

    Maintenant:

    char * mot = "mot"; en C
    OU
    String mot = "mot"; en Java
    Non, non, non. Tu ne peux absolument pas faire ce raccourci. En C, « char * » est un pointeur vers un caractère. Il se trouve qu'une « chaîne de caractères », comme son nom l'indique, est une suite de caractères en mémoire. Ledit pointeur pointe donc le premier caractère de la lsite. Si tu l'incrémentes, tu passes au caractères suivant (ce qui te permet, accessoirement, de lire la chaîne en entier).

    En Java, et dans d'autres langages tels que le C++, « String » est un objet à part entière et « mot » est une instance de cet objet. Il s'agit généralement d'un descripteur de chaîne, lequel contient des références pour aller la retrouver au milieu d'un espace mémoire dédié.

    En Java, il n'y a pas de pointeurs (enfin, pas visibles au niveau de l'utilisateur). En C++, tu peux éventuellement faire un pointeur vers un objet « std::string » mais si tu l'incrémentes, tu passeras à la chaîne suivante (soit la prochaine instance de ce type d'objet), pas au caractère suivant.


    Comment l'identifiant String ou char, s'expriment-t-ils en assembleur?

    Je sais qu'il n'y a que des 0-1. Si je place
    1 mov ax, [Data] ; adressage mémoire direct normal d’un mot
    Il n'y a que moi qui sache que c'est un texte. Comment est-ce que je me le dit en assembleur sans ajouter
    ; adressage mémoire direct normal d’un mot
    ?
    Comme tu l'as dit, il n'y a que toi qui sache que c'est un texte. Il n'y a quasiment pas de typage, pour la bonne raison que le microprocesseur lui-même n'a pas la notion des types évolués. Ce sont des considérations qui appartiennent aux langages de niveau supérieur.

    Toutefois, il existe sur Intel des instructions telles que LODS, STOS, MOVS (Pour «Move String» ou, plus précisément : « Move Data From String to String ») qui sont conçues pour faire des mouvements de blocs de données. Ce sont en fait des raccourcis pour faire ce que l'on fait en deux ou trois instructions partout ailleurs : déplacement, décrémentation, boucle. Ces instructions déplacent n'importe quel type de données.

  7. #7
    Membre régulier Avatar de J4e8a16n
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 271
    Points : 119
    Points
    119
    Par défaut
    En final et merci beaucoup.

    Est-ce que MOV PTR [SI], eax ; est possible

    c'est un peu comme en inverse
    mov eax, [edx];

    JPDaviau
    Petit Malin
    "accélérateur . . . qui pousse . . . un électron a passer par deux trous d’un écran en même temps." (Cyrille Burt: "C’est mieux qu’un fantôme") (Janus p.251)
    "Joy is to love what is, pain is to love what is not"
    )

    HP Pavilion Elite Desktop PC 570-p0xx - Window10 64 bits - Intel(R) Core(TM)2 Quad CPU Q8200 @ 3GHz x86_64-w64-mingw32-gcc-7.3.0.exe

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 631
    Points
    23 631
    Par défaut
    Citation Envoyé par J4e8a16n Voir le message
    En final et merci beaucoup.

    Est-ce que MOV PTR [SI], eax ; est possible
    « PTR » tout seul ne veut rien dire. Puisque EAX est sur 32 bits, il aurait fallu écrire « DWORD PTR » mais, en l'occurence, c'est optionnel puisque le compilateur sait déjà quel est le format de EAX.

    c'est un peu comme en inverse
    mov eax, [edx];
    Oui, sauf que tu utilise SI et pas EDX.

  9. #9
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    lea registre [contenu Lp]

  10. #10
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Bonjour,

    Citation Envoyé par J4e8a16n Voir le message
    char * mot = "mot"; en C
    OU
    String mot = "mot"; en Java

    Comment l'identifiant String ou char, s'expriment-t-ils en assembleur?
    C'est du même genre que ce code :
    La variable mot devient un alias pour l'adresse de la chaîne. En C et dans ce code assembleur la chaîne est une suite de caractères terminée par zéro, et mot pointe sur le premier caractère. En Java mot référence un objet String.

    En C les chaînes littérales ne sont accessibles qu'en lecture, pour éviter les bugs il faut qualifier les pointeurs en conséquence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* mot = "mot";
    Citation Envoyé par Obsidian Voir le message
    En Java, et dans d'autres langages tels que le C++, « String » est un objet à part entière et « mot » est une instance de cet objet. Il s'agit généralement d'un descripteur de chaîne, lequel contient des références pour aller la retrouver au milieu d'un espace mémoire dédié.
    En C++ string est une classe. En Java String est une classe, et un objet (une instance de la classe Class).
    :wq

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

Discussions similaires

  1. Créer des grilles se comportant comme des caractères
    Par fantime dans le forum Débuter
    Réponses: 2
    Dernier message: 23/10/2013, 21h21
  2. Réponses: 6
    Dernier message: 07/07/2011, 20h53
  3. pour que les < se comportent comme des " (include)
    Par hpavavar dans le forum Visual C++
    Réponses: 4
    Dernier message: 07/05/2007, 09h46
  4. Réponses: 1
    Dernier message: 25/07/2006, 15h52
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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