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] La directive "org"


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [NASM] La directive "org"
    Bonjour à tous, une petite question concernant la directive "org" avec nasm (qui permet si je ne dis pas de bêtises, de charger le programme en mémoire à l'adresse spécifiée): à quel endroit dois-je la placer dans le code ?

    Comment faire pour qu'elle soit reconnue par nasm ? car j'ai le droit à un joli "error: parser: instruction expected" quand j'essaye naïvement de la placer au tout début de mon programme (ex: org 100h), j'ai été consulter la doc mais il n'y a que peu d'exemples...

    Merci d'avance.

  2. #2
    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 090
    Points
    43 090
    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

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai déjà essayé avec cette forme-là (même erreur)...

  4. #4
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Bonsoir,

    Org 100h c'est pour faire des programmes 16bits sous DOS
    Donc si ton programme n'en est pas un, il est normal que ça fasse une erreur

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ah merci! Mais alors, comment faire si je veux que mon programme commence à une adresse mémoire que je spécifie sous un autre système, dans mon cas, une Debian Gnu/linux 64 bits ?
    Veuillez excuser mes approximations de débutant en assembleur (par ailleurs je recherche un cours pour vraiment me former sur NASM)

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Bonsoir,

    ORG signifie « Origin ». Cela ne sert pas exactement à « charger le programme à un endroit donné » mais à indiquer au compilateur à quel endroit en mémoire on est censé se trouver au moment où l'on compile car l'adresse courante peut influer sur le calcul des codes opérations correspondant aux instructions, voire même être nécessaires : quand on fait un branchement (un saut vers une ligne donnée), la plupart du temps, ce branchement est relatif, c'est-à-dire qu'il est codé pour se déplacer de plus ou moins n octets par rapport à la position courante. Par contre, quand on pointe une donnée, par exemple si l'on veut charger l'adresse d'une chaîne de caractères spécifiée dans le code, alors c'est l'adresse exacte de la chaîne qui est chargée dans le registre concerné, à l'exécution. Il faut donc que ce soit la bonne dès le départ.

    Il existe certains codes opérations qui permettent là encore de charger une adresse effective par rapport à l'état du pointeur de programme. Un code entièrement « relatif » est dit « relocatable » en anglais. Même en faisant beaucoup d'efforts, il est assez rare de pouvoir s'affranchir systématiquement de toutes ces contraintes, si bien que les fichiers exécutables et autres ressources sont souvent pourvus d'une table de tous les « trous » à combler et adresses à corriger dans le programme, lequel est ainsi mis à jour par le système au moment du chargement.

  7. #7
    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 090
    Points
    43 090
    Par défaut
    org 0x100, c'est plutôt pour faire du code 16 bits ms-dos.

    Pour une debian, comme l'a dit Obsidian, il faut laisser le système gérer.

    sans org, pour compiler ton source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nasm -f elf source.asm
    gcc source.o -o source
    Exemple d'Hello world :

    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
     
    BITS 32
     
    extern puts
     
    section .text
     
    GLOBAL main
     
    main:
    push dword chaine
    call puts
    add esp,4
    ret
     
    SECTION .data
    chaine db "Hello World",0
    Ce code utilise la fonction puts de la libc. main est necessaire pour l'edition de liens.

    Tu veux faire quoi exactement ?
    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

  8. #8
    Invité
    Invité(e)
    Par défaut
    D'habitude je ne le dirais pas, mais une simple lecture de la doc de nasm suffit amplement: http://www.nasm.us/xdoc/2.11.08/html...#section-7.1.1

    Comme tu le vois, il n'y a que le format bin (raw) qui permet d'ajouter un nombre à toutes références mémoires dans ton code source, après si tu veux absolument le faire pour des formats obj d'OS, il suffit juste de le faire manuellement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    %define     _ORG1  0x100
     
    (label1 + _ORG1):
        ; code
    Voilà ^^

  9. #9
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir
    Pour compléter Obsidian je dirais pour ma part que la directive ORG ( ORG expression ) est une directive d'alignement de compteur d'assemblage en clair, elle remet le compteur de l'emplacement de l'assembleur à l'expression fournie.

    Et son rôle est de définir une nouvelle valeur au compteur d'assemblage et donc de positionner les objets qui vont suivre à l'adresse effective que vous avez donné (en clair 0x100 ) cette directive est également utilisé pour localiser des données ou du code a une adresse effective particulière dans d'autres cas, cela peut s'apparenter le plus souvent comme étant une adresse de chargement au moment de la compilation mais il peut être également utilisé pour définir des adresses absolues, ou bien utilisé pour créer voire générer un alignement spécifique.

    Citation Envoyé par chrtophe Voir le message
    org 0x100, c'est plutôt pour faire du code 16 bits ms-dos.
    Attention cette directive ne veut pas forcément dire que l'on travaille sur MS-DOS , DOS en 16 bits mais plutôt qu’il faudra ajouter 256 à tous les offsets.
    Là ou votre justification prend toute ça place c'est du au fait que le DOS chargera le programme qu'après le PSP (Ox100) car ne rien mettre par défaut sous du MASM ou TASM chargera le programme à la position ( l'offset 0000 ) et donc pour pallier à cela et charger correctement le programme il vous faut alors redéfinir le début du code à un emplacement précis pour faire court après PSP ( ORG 0x100 ).
    Il est également tout à fait possible d'écrire le code ci-dessous et être sous DOS et cela ne nous dit pas si on travaille en 16, 32, 64 ou 128 bits
    (dans le cas de l'exemple ci-dessous en est dans un modèle de mémoire de fichier exécutable de type .com qui utilise un segment de 64 Ko et que ce modèle est le plus simple )
    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .MODEL SMALL
    .STACK 100H
    .DATA
    Pour être "En 16 BIT " ( BITS 16 / BITS 32 )
    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BITS 32
    extern puts
    section .text
    GLOBAL main
    Code ASM : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SEG_CODE SEGMENT USE16
    ASSUME CS:SEG_CODE DS:NOTHING etc....

    Citation Envoyé par Medrogan Voir le message
    Ah merci! Mais alors, comment faire si je veux que mon programme commence à une adresse mémoire que je spécifie sous un autre système, dans mon cas, une Debian Gnu/linux 64 bits ?
    Veuillez excuser mes approximations de débutant en assembleur (par ailleurs je recherche un cours pour vraiment me former sur NASM)
    Si vous programmez sous UNIX/GNU LINUX il est mieux de procéder comme mon exemples ci-dessous ou en utilisant les API Linux comme l'exemple de chrtophe.

    Code ASM : 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
    23
    24
    25
     
     
    %define ORG 0x100h              ; directive [ORG] mise pour l'exemple cas débatu 
                                    ; mise ici pour un exemple
     
    section .text                   ; Segment code
        global _start
    _start:
        xor eax, eax                ; Ecrassement (0)
        mov eax, 4h                 ; Ecriture
        mov ebx, 1                  ; Sortie standar
     
        mov ecx, msg                ; Adresse de msg 
        ;mov edx, siz                ; Taille du message (erreur remarque de chrtophe )
        mov edx, siz_msg          ; Taille du message 
        int 0x80                    ; Appel (interrupteur 128 = 80h)
     
        mov eax, 1                  ; Appel fonction exit
        mov ebx, 0                  ; 0 en code retour
        int 0x80        
     
    section .data                   ; segment de donnée
        msg db "Bonjour vous ?",0xa ; Message a afficher 0xa  = 10
        siz_msg equ $-msg           ; Taille du message ( constante )
    section .bss    ; segment pile inutiliser

    Pour ce qui est des cours vous trouverez de tout ce dont vous avez besoin pour débuter en assembleur sur ce site et tout comme vous j'apprends
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  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 090
    Points
    43 090
    Par défaut
    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
    23
    24
     
     
    %define ORG 0x100h              ; directive [ORG] mise pour l'exemple cas débatu 
                                    ; mise ici pour un exemple
     
    section .text                   ; Segment code
        global _start
    _start:
        xor eax, eax                ; Ecrassement (0)
        mov eax, 4h                 ; Ecriture
        mov ebx, 1                  ; Sortie standar
     
        mov ecx, msg                ; Adresse de msg
        mov edx, siz                ; Taille du message
        int 0x80                    ; Appel (interrupteur 128 = 80h)
     
        mov eax, 1                  ; Appel fonction exit
        mov ebx, 0                  ; 0 en code retour
        int 0x80        
     
    section .data                   ; segment de donnée
        msg db "Bonjour vous ?",0xa ; Message a afficher 0xa  = 10
        siz_msg equ $-msg           ; Taille du message ( constante )
    section .bss    ; segment pile inutiliser
    Le code est erroné, il faut remplacer :
    mov edx,siz par mov edx,siz_msg.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    %define ORG 0x100h
    n'aura comme seul effet de remplacer les occurrences de ORG par 100h dans le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Attention cette directive ne veut pas forcément dire que l'on travaille sur MS-DOS , DOS en 16 bits mais plutôt qu’il faudra ajouter 256 à tous les offsets.
    Là ou votre justification prend toute ça place c'est du au fait que le DOS chargera le programme qu'après le PSP (Ox100) car ne rien mettre par défaut sous du MASM ou TASM chargera le programme à la position ( l'offset 0000 ) et donc pour pallier à cela et charger correctement le programme il vous faut alors redéfinir le début du code à un emplacement précis pour faire court après PSP ( ORG 0x100 ).
    Il est également tout à fait possible d'écrire le code ci-dessous et être sous DOS et cela ne nous dit pas si on travaille en 16, 32, 64 ou 128 bits
    (dans le cas de l'exemple ci-dessous en est dans un modèle de mémoire de fichier exécutable de type .com qui utilise un segment de 64 Ko et que ce modèle est le plus simple )
    Je ne connais pas d'autre situation ou il faut une adresse d'origine 100h.

    Sous DOS, tu es obligatoirement en 16 bits, pour utiliser du 32 bits, il te faut utiliser un DOS Extender, et une partie du code sera en 16 bits. A moins de passer en mode protégé depuis le .com, et alors adieu aux API DOS. Et il ne faut pas être en surcouche Windows.
    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 expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonsoir
    Citation Envoyé par chrtophe Voir le message
    Le code est erroné, il faut remplacer :
    mov edx,siz par mov edx,siz_msg.
    Très bonne remarque je vais corrigé
    Citation Envoyé par chrtophe Voir le message
    Je ne connais pas d'autre situation ou il faut une adresse d'origine 100h.
    abusivement quand on voit cette expression ont dit tout de suite que c'est du DOS 16 bits hors ce n'est pas forcément ça qui la caractérise car le DOS est en 16 bit.
    et encore merci pour la correction à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

Discussions similaires

  1. [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
  2. [NASM] Syntaxe des labels et de la directive times
    Par andromeda dans le forum Assembleur
    Réponses: 1
    Dernier message: 02/04/2007, 22h02
  3. Hors série PCTEAM sur Direct 3D
    Par Shakram dans le forum DirectX
    Réponses: 1
    Dernier message: 12/10/2002, 16h34
  4. La communauté Direct X est au repos?
    Par Shakram dans le forum DirectX
    Réponses: 21
    Dernier message: 18/07/2002, 23h32
  5. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05

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