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

Assembleur Discussion :

ASM et C++ : problème avec un mov


Sujet :

Assembleur

  1. #1
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 4
    Points : 3
    Points
    3
    Par défaut ASM et C++ : problème avec un mov
    Bonjour à tous, j'ai actuellement le code suivant en c++ / asm, mon problème est le suivant : le mov prenant la structure retourne une erreur à la compilation. Apparement, cette opération n'est pas possible, problème en PASCAL elle l'est, donc comment réécrire ce mov, avec un movx ?
    En vous remerciant par avance d'une réponse rapide
    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
    typedef struct TSerPacket {
        WORD    Info;
        long    SerNo;
        char    Vol[11];
        char    FileType[8];
    };
    void DoTest()
    {
        TSerPacket SPacket;
        asm{
            mov ah, 69h            // Command
            mov al, 0
            mov bl, 0            // Disk ID
            mov dx, SPacket        // Put our struct address in DX
            int 21h                // Call the Interrupt.
        }
    }
    When the lock is off and the light is on, push the door and enter in a new world

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Le problème est bien sur cette ligne :

    En faisant cela tu tente de mettre toute la structure dans DX, alors que ce que tu souhaites c'est plus probablement mettre le pointeur vers la structure dans DX.

    Essaye qque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov dx, offset SPacket
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov dx, offset [SPacket]
    Le problème est que c'est fortement dépendant de l'assembleur, et comme le langage assembleur est loin d'être standardisé...

    N.B : il est tout à fait possible de faire la même chose sans passer par l'assembleur, via la spécification SMART des disques durs (encore faut-il que le SMART soit disponible mais ca l'est dans la plupart des cas).
    Sous Windows il suffit de leur envoyer un IOCTL via l'API DeviceIoControl, mais j'ignore quels sont les IOCTL à envoyer... il faudra peut être chercher dans le DDK pour ça...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 23
    Points : 28
    Points
    28
    Par défaut
    Un :
    ne peut pas fonctionner. En programmation 16 bits seul un registre d'index ou basé peut être utilisé pour manipuler des adresses. C'est la rigueur du 16 bits.

    Essaye plutôt :
    ou

    N'oublie pas que toute structure de données est manipulée par des pointeurs. Dans l'assembleur pur ce n'est que ça.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 23
    Points : 28
    Points
    28
    Par défaut
    MEA CULPA

    Voilà ce qui arrive qu'on on écrit les réponses trop vite. Je saurai m'en rappeler !!!

    Mille excuses à Neitsa.

    un :
    Fonctionne très bien, oublie tout ce j'ai écrit dans l'article précédent.

    Mais pour être complet tu peux aussi utiliser :

  5. #5
    Candidat au Club
    Inscrit en
    Février 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Merci
    Merci beaucoup pour vos réponse, mais vous pouvez me confirmer qu'avec ça on récupèrera bien dans la structure les données sur le disque dur (Numéro de Série etc....) ? Même si je change mon registre de dx à bx ?
    C'est un code que j'ai trouvé sur le net en pascal et que j'ai adapté mais ça me semble un peu short quand même !
    Autre question, pourquoi le dx passe avec GCC mais pas avec l'assembleur de visual studio ?
    When the lock is off and the light is on, push the door and enter in a new world

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par somebodyishere
    Autre question, pourquoi le dx passe avec GCC mais pas avec l'assembleur de visual studio ?
    int21 et le code 16bit ne fonctionne pas sous Windows 32bits;
    VS est un environnement 32 bits.
    int21 ne fonctionne que sous DOS

  7. #7
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 23
    Points : 28
    Points
    28
    Par défaut
    Si tu utilise le registre bx cela ne marchera pas il faut utiliser le registre dx pour pour passer l'adresse offset de ta structure. Néanmoins je suis d'accord avec
    mat.M le code 16 bits ne fonctionne pas dans un environnement 32 bits.

    Créer plutôt un fichier "*.com" là ça fonctionnera même sous XP mais le faire est pour toi pas très intéressant puisque cela sera un programme à part entière et totalement indépendant de ton programme principale. Ceci dit tu peux créer ce fameux fichier "*.com" l'exécuter par ton programme 32 bits et récupérer l'info de cette manière. En programmation rien n'est impossible il suffit d'avoir beaucoup d'immagination !!!

Discussions similaires

  1. problème avec la librairie asm/uaccess.h
    Par black_clouds dans le forum C++
    Réponses: 12
    Dernier message: 25/06/2010, 14h56
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. 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