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 :

registre cr0 et assembler in line (VS C++)


Sujet :

x86 32-bits / 64-bits Assembleur

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut registre cr0 et assembler in line (VS C++)
    Hello world

    J'ai traduis depuis un cod en assembleur GCC en assembleur en ligne pour Visual C ++. Sa compile bien mais quand je débogue les applications freeze quand elle rencontre le registre cr0. L'espion m'indique des valeurs pour tout les registres sauf cr0. Malgre que je soit en mode Kernel j'ai cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cr0	CXX0017: Error: symbol "cr0" not found
    Visual C++ assembler in line code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void disableCache(void)
    {
       uint32_t mask = (1 << 30) | (1 << 29);
       __asm
       {
          mov ecx,mask
          mov eax,cr0
          or eax,ecx
          mov cr0,eax
       }
      return;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void enableCache(void) 
    {
    	uint32_t mask = ~((1 << 30) | (1 << 29)); // CD | NW
    	  __asm
       {
          mov ecx,mask
          mov eax,cr0
          and eax,ecx
          mov cr0,eax
       }
      return;
    }
    Pouvez vous m'aider SVP?

    THX

    NB: le code original en GCC inline.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    void disableCache(void) {
      uint32_t mask = (1 << 30) | (1 << 29); // CD | NW
      __asm__ __volatile__ ("movl %%cr0,%%eax\n"
                            "orl %%ecx,%%eax\n"
                            "movl %%eax,%%cr0"
                            :
                            :"c"(mask)
                            :"eax","memory");
      return;
    }
     
    void enableCache(void) {
      uint32_t mask = ~((1 << 30) | (1 << 29)); // CD | NW
      __asm__ __volatile__ ("movl %%cr0,%%eax\n"
                            "andl %%ecx,%%eax\n"
                            "movl %%eax,%%cr0"
                            :
                            :"c"(mask)
                            :"eax","memory");
      return;
    }

  2. #2
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Dans les 2 cas sa freeze a cette ligne:


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

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Il semble que le premier code est des redondance et il peut etre reecrit ainsi, de plus je travail sur une veille config avec seulment 128mo de ram:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void disableCache(void)
    {
          __asm
       {	   
    	mov     eax, cr0   
            or        eax, 0FFFFFFFH   
            mov     cr0, eax
       }
      return;
    }
    penser qu'il produit le meme resultat?

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 088
    Points
    43 088
    Par défaut
    Je présumes que tu veux activer/désactiver le cache. Tu dois dans ce cas masquer ou forcer à 1 le bit 30 de cr0 sans modifier les autres bits.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Merci

    Citation Envoyé par chrtophe Voir le message
    Je présumes que tu veux activer/désactiver le cache. Tu dois dans ce cas masquer ou forcer à 1 le bit 30 de cr0 sans modifier les autres bits.
    Je ne sais pas comment faire. Sa freeze toujours a cette ligne:

    J'ai trouve ce code mais sa freeze toujours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax,cr0
    	or  eax,60000000h
    	mov cr0,eax
    Sinon j'ai sa, sa freeze pas mais je sais si c'est la meme chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        mov     eax, cr0
        bts     eax, 30
        btr     eax, 29
        mov     cr0, eax

  6. #6
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    ce code met le bit 29 et 30 a 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax,cr0
    or  eax,60000000h
    mov cr0,eax

    ce code met le bit 30 a 1 et le bit 29 a 0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mov eax,cr0
    bts     eax, 30
    btr     eax, 29
    mov cr0,eax
    si tu veux seulement mettre le bit 30 a 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax,cr0
    or  eax,40000000h
    mov cr0,eax
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax,cr0
    bts     eax, 30
    mov cr0,eax

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Merci
    Du coup si je fait sa est ce que j'aurais 29 et 30 = 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mov eax,cr0
    bts     eax, 30
    bts     eax, 29
    mov cr0,eax

  8. #8
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    oui, l'intruction "bts reg/mem,x" signifie Bit Test and Set. ça met le bit x de reg/mem dans le bit de retenue (carry flag) et met a un le bit dans reg/mem et dans le même esprit btr signifie Bit Test and Reset (on met le bit a zéro), btc signifie Bit Test and Complement (on inverse le bit), et bt pour Bit Test (qui ne modifie pas le bit)

  9. #9
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Du coup j'ai le meme freeze donc conclusion c'est le passage du bit 29 vers 1 qui pose probleme...

  10. #10
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 088
    Points
    43 088
    Par défaut
    A mon avis, tu génère une exception que l'os n'arrive pas à résoudre.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  11. #11
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    j'ai trouvé ici: https://software.intel.com/en-us/art...dm#nine-volume dans le volume 3A chapitre 11 a la page 424, des informations sur l'effet du changement de bit 30(CD) et 29(NW)
    il semblerait que le mode de cache avec ces deux bit a 1 ne soit pas supporté par les processeur a partir du pentium4, sans doute est ce que la source dont tu test inspiré pour écrire ton code est trop ancienne

    et par curiosité, pourquoi vouloir désactiver le cache?

  12. #12
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Je travaille sur un PIII. C'est du tres vieux hardware.

  13. #13
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Ce code ne freeze pas mais je sais si il fait le job:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        mov eax, cr0
        or  ax, 1
        mov cr0, eax

  14. #14
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    ces lignes font passer le processeur en mode protégé, et si t'est déjà en mode protégé, c'est normal que ça ne fasse rien

    comment est exécuté ton programme?

  15. #15
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par bifur Voir le message
    j'ai trouvé ici: https://software.intel.com/en-us/art...dm#nine-volume dans le volume 3A chapitre 11 a la page 424, des informations sur l'effet du changement de bit 30(CD) et 29(NW)
    il semblerait que le mode de cache avec ces deux bit a 1 ne soit pas supporté par les processeur a partir du pentium4, sans doute est ce que la source dont tu test inspiré pour écrire ton code est trop ancienne

    et par curiosité, pourquoi vouloir désactiver le cache?
    c'est pour utiliser toute la ram dispo, au lieu de la moitié sur une apps precise. Bon il s'agit de vieux matos PIII avec 128mo de ram.
    Du coup comment desactivé les deux?

    NB: ce petit semblerait resoudre mon probleme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mov ecx, 0x2ff
    rdmsr
    mov al, 0x06
    wrmsr

  16. #16
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    j'ai jamais entendu parler que la désactivation du cache faisait gagner de la ram (et encore moins la doubler) et le bout de code que tu as proposé semble bien configurer la ram mais pour le moment c'est pas facile a comprendre parce que ça fait appel aux "machine specific register" que je n'avait jamais cherché a manipuler


    edit: peut être que pour pouvoir utiliser plus de ram pour ton app il faudrait voir du coté du système d'exploitation (c'est lui qui gère l'allocation des ressources)

  17. #17
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Merci à tous

    Il semblerait qu'il y ait un souci avec les PIII :

    cr0 supports many different features but only the CD and NW flags have to do with caching. In other words, don't waste time experimenting with other bits.
    For the Pentium III, when CD and NW bits are set, external snoops are supported only on dual processors, so it will hang in uniprocessor systems as you could confirm. If you don't snoop it will run good.
    En debug sa freeze toujours alors que lorsque je lance normalement le programme pas de souci...c'est bizarre...

  18. #18
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 19
    Points : 2
    Points
    2
    Par défaut Initialisations....de la GDB
    Bonjour tout le Monde


    Avant de commuter en mode protege, il faut initialiser la GDT de facon a ce qu'apres le passage dans le nouveau mode, il n'y ait pas de probleme d'adressage. La GDT doit contenir des descripteurs pour les segments de code, de donnees et de pile.


    Cordialement.

Discussions similaires

  1. [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
  2. Utilisez vous la base de registres ?
    Par gRRosminet dans le forum C++Builder
    Réponses: 8
    Dernier message: 04/06/2002, 13h55

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