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 :

[NASM 64 bits] Problèmes d'assemblage de code 32 bits


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [NASM 64 bits] Problèmes d'assemblage de code 32 bits
    Bonjour,

    Dans le cadre de mes études en informatique, des cours d'assembleur me sont dispensés. Sont mis à notre disposition :
    - un canevas général d'un programme ecris en assembleur;
    - un fichier ecris en c++ (io.cpp), par l'intermédiaire duquel on peut afficher le contenu de certains registres.

    Sur les ordinateurs sur lesquels nous travaillons se trouve Linux 32bits.
    Or, chez moi, je travaille avec Linux 64bits et j'ai des problèmes.

    Lorsque je compile mon fichier assembleur en vue d'obtenir un fichier objet, tout se passe bien. (nasm -f elf canevas.asm).
    Mais lors de la compilation finale (g++ io.cpp canevas.asm), j'obtiens un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i386 architecture of input file `canevas.o' is incompatible with i386:x86-64 imput output
    Je me demandais d'où provenais cette erreur. J'ai déjà essaye de nombreuses choses (utiliser yasm plutot que nasm, utiliser la commande elf64 plutot que elf, ...) mais rien n'y fais.
    Lorsque j'utilise elf64 plutot que elf, on me dit que les instructions POPA et PUSHA ne sont pas valides en mode 64-bits.

    Voici les fichiers en question, ce serait sympa que quelqu'un travaillant sous Linux 64bits essayent les mêmes commandes que moi :
    canevas.asm
    io.cpp

    Merci d'avance !

  2. #2
    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
    Il y a trop de différences entre l'assembleur 32 et 64 bits, tu ne t'y mettras pas facilement. Essaie une option comme -m32 pour créer un exécutable 32 bits.

    Edit : utilise PUSHAD et POPAD sinon il n'y a que la partie basse des registres qui est passée et restaurée.
    :wq

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Ok j'essaye ça en rentrant, je te dis quoi après.
    Merci pour ta contribution

  4. #4
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Même problème :
    POPAD et PUSHAD ne sont pas valides en mode 64-bits.
    Je vais me rabattre sur mon windows (qui lui est en 32-bits) pour coder en assembleur.

  5. #5
    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
    Citation Envoyé par Jordy89 Voir le message
    Même problème :
    POPAD et PUSHAD ne sont pas valides en mode 64-bits.
    Oui, je parlais pour le mode 32 bits. Si tu tiens à utiliser le mode 64 bits il va falloir changer les appels de fonctions, en plus la convention n'est pas la même sur Windows et Linux. Normalement ton OS doit pouvoir lancer les programmes 32 bits, tu as essayé d'en faire un avec l'option -m32 ?
    :wq

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    l'option -m32 je la met lors de la compilation du fichier objet avec le fichier c++ d'entrée/sortie ?

    g++ -m32 ....

    ou nasm -f elf m-32 .... ?

  7. #7
    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
    Dans la ligne de commande de g++, normalement pour le fichier ASM tu mets une directive du genre BITS 32 au début pour empêcher NASM de sortir du code 64 bits.
    :wq

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    nope ça marche pas, je vais me résigner à coder de l'asm sous windows

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13
    Points : 18
    Points
    18
    Par défaut [RESOLU]


    Bonjour,

    La réponse arrive un peut tard , mais je viens de rencontrer le même problème et après avoir lu ce mail, je me suis mis à chercher tout seul (pas très longtemps).

    La solution :

    nasm -f elf <fichier_source_asm>

    génère un fichier 32bits, d'où l'erreur fatale et irrémédiable que vous renvoie 'ld' sur une architecture linux 64bits.

    Pour que nasm génère un objet 64bits, il faut utiliser le format elf64 au lieu de elf tout cours.

    exemple :


    nasm -f elf64 <fichier_source_asm>

    ensuite, il n'y a pas de différence avec ld.

    remarque :
    C'est pratique pour générer des objets 32bits pour construire des objets à destination d'autres architectures, et notemment un linux 32bits i386 depuis un linux 64bits.

    nb: pour connaire la liste des formats que l'on peut générer taper :

    nasm -hf

    majµcarma

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/06/2015, 22h05
  2. Réponses: 18
    Dernier message: 11/06/2013, 16h06
  3. [NASM] Code 16 bits avec une directive 32 bits
    Par bubulemaster dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 09/10/2009, 17h29
  4. Réponses: 10
    Dernier message: 19/09/2006, 10h44
  5. [VB.net]problème de conversion de code c# vers VB.net
    Par cladsam dans le forum Windows Forms
    Réponses: 2
    Dernier message: 18/10/2005, 14h07

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