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 :

[TASM] Passage d'argument à une macro


Sujet :

Assembleur

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut [TASM] Passage d'argument à une macro
    Salut, c'est encore moi, décidemment l'assembleur m'en cause des ennuis mais j'aime ça !

    Donc j'ai un code avec une macro dedans :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    .386
     
    code segment use16
     
    assume cs:code, ds:data, ss:pile
     
    debut :
     
    ;----------------------Macros-----------------------------------------
    	printf macro text?
    		local text, fin
     
    		push ax dx
     
    		mov dx, offset text
    		mov ah, 09h
    		int 21h
     
    		pop dx ax
    		jmp short fin
     
    		text db text?,'$'
     
    		fin :
    	endm
    ;-----------------------------------------------------------------------------
     
    	push data
    	pop ds
     
    	printf "Salut !"
     
    	mov ah, 4ch
    	int 21h
    code ends
     
    data segment use16
     
    data ends
     
    pile segment stack use16
     
    	remplissage db 256 DUP(?)
     
    pile ends
     
    end debut
    Je compile :
    TASM /m9 test_macro.asm
    pas d'erreur
    pas de warning
    Je lance le programme
    pas de message "Salut" mais du n'importe quoi...
    Je pense que cela vient de l'argument, pourtant j'ai fais des recherches, c'est comme cela qu'on le code, ou alors je suis vraiment aveugle
    Merci pour votre aide
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  2. #2
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    Salut,

    Je ne suis pas un expert des macros TASM, mais pour moi le probleme viens du fait que tu passe une chaine alors que tu devrais passer un pointeur sur la chaine. :

  3. #3
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Salut, merci pour ta réponse

    probleme viens du fait que tu passe une chaine alors que tu devrais passer un pointeur sur la chaine. Question
    tu pourrais etre un peu plus precis stp car je debute en asm donc les pointeurs de chaines

    C'est bizarre, je me suis (beaucoup) inspiré du tuto
    · Tutoriel d'initiation débutant à l'assembleur (INTEL 80x86 / 16 bits ) par Benoît-M
    et dedans il y a la macro :
    http://benoit-m.developpez.com/assem...tie3-2_Ex4.png
    et il l'appelle en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecrit_texte “Coucou ! Ceci est un essai !”
    J'ai du zaper ou mal comprendre quelque chose
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2005
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 84
    Points : 78
    Points
    78
    Par défaut
    E neffet je viens de regarder son tutoriel, et tu n'as pas fais d'erreur.
    Enfin moi je n'utilise pas TASM, mais NASM.

    J'espere que d'autres pourront t'aider.

  5. #5
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    E neffet je viens de regarder son tutoriel, et tu n'as pas fais d'erreur.
    Enfin moi je n'utilise pas TASM, mais NASM.


    J'espere que d'autres pourront t'aider. Confused
    Merci quand meme
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 939
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Bonjour !

    Quelle est l'utilité exacte du ? de
    Dans le tutoriel, il est même dit que ce point d'interrogation n'est pas requis.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  7. #7
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Quelle est l'utilité exacte du ? de
    Code:
    text db text?,'$'
    pour montrer que c'est un paramêtre, je ne sais guère
    Mais j'ai déjà éssayé en le retirant, ça ne change malheureusement rien
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  8. #8
    Membre habitué

    Inscrit en
    Avril 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 32
    Points : 150
    Points
    150
    Par défaut
    Salut,

    A vue d'oeil, ds:dx ne pointe pas vers text, puisque text ne se trouve pas dans le segment data alors que ds pointe vers data.

    A+

  9. #9
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Benoît-M
    Salut,

    A vue d'oeil, ds:dx ne pointe pas vers text, puisque text ne se trouve pas dans le segment data alors que ds pointe vers data.

    A+
    Je ne suis pas très expérimenté en asm (à vrai dire pas du tout même) tu pourrais détaillé stp ?
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  10. #10
    Membre habitué

    Inscrit en
    Avril 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 32
    Points : 150
    Points
    150
    Par défaut
    Lors de l'appel de la fonction 9 de l'interruption 21h, ds:dx doit pointer vers le texte à afficher. Autrement dit ds doit pointer vers le segment qui contient les données à afficher, et dx vers l'offset de ces données à l'intérieur du segment.

    Or dans ton code, ds pointe vers le segment data alors que ton texte se trouve dans le segment de code. Normalement si tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    push ds
    push cs
    pop ds
    // reste du code ici //
    pop ds
    ca devrait passer.

    --Edité pour corriger le code

  11. #11
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Lors de l'appel de la fonction 9 de l'interruption 21h, ds:dx doit pointer vers le texte à afficher. Autrement dit ds doit pointer vers le segment qui contient les données à afficher, et dx vers l'offset de ces données à l'intérieur du segment
    Merci pour cette précision, j'ai essayé ça :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    .386
     
    code segment use16
     
    assume cs:code, ds:data, ss:pile
     
    debut :
    	push data
    	pop ds         ;ds pointe sur data
    ;----------------------Macros-----------------------------------------
    	printf macro text?
    		local fin, text
    		push ds ax dx       ;sauvegarde ds, ax et dx
     
    		xor ax, ax
    		mov al, text
    		mov ds, ax          ;ds pointe sur texte
    		mov dx, offset text   ;dx sur l'offset de texte
    		mov ah, 09h
    		int 21h
     
    		pop dx ax ds     ;on restaure ds,ax et dx
    		jmp short fin
     
    		text db text?,'$'   ;données
     
    		fin :
     
    	endm
    ;-----------------------------------------------------------------------------
    	printf "Salut !"
     
    	mov ah, 4ch
    	int 21h
     
    code ends
     
    data segment use16
     
     
    data ends
     
    pile segment stack use16
     
    	remplissage db 256 DUP(?)
     
    pile ends
     
    end debut
    Mais je dois encore avoir faux car ça m'affiche n'importe quoi...
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  12. #12
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Je viens de reussir !! (grâce à ton aide )
    En revanche je ne sais pas si c'est un beau code ou si c'est du bidouillage (chose que je n'aime pas..), le voici :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    .386
     
    code segment use16
     
    assume cs:code, ds:data, ss:pile
     
    debut :
    	push data
    	pop ds
    ;----------------------Macros-----------------------------------------
    	printf macro text?
    		local fin, text
    		push ds ax dx
     
    		mov ax, data2
    		mov ds, ax
    		mov dx, offset text
    		mov ah, 09h
    		int 21h
     
    		pop dx ax ds
    		jmp short fin
     
    	data2 segment use16
    		text db text?,'$'
    	ends
     
    		fin :
     
    	endm
    ;-----------------------------------------------------------------------------
    	printf "Salut !"
     
    	mov ah, 4ch
    	int 21h
     
    code ends
     
    data segment use16
     
     
    data ends
     
    pile segment stack use16
     
    	remplissage db 256 DUP(?)
     
    pile ends
     
    end debut
    Pour que ça fonctionne j'ai donc mis un segment de données data2 directement dans la macro et fait pointer ds dessus en debut de macro.
    J'espere que c'est correct, sinon n'hésitez pas à me le faire savoir !
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  13. #13
    Membre habitué

    Inscrit en
    Avril 2002
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 32
    Points : 150
    Points
    150
    Par défaut
    C'est quand même un peu bizarre, ces segments imbriqués (data2 se trouve à l'intérieur de code)... Mais bon c'est toi qui vois.

    Je crois que tu t'embêtes pour pas grand chose. Etant donné que ton texte est déclaré à l'intérieur de la macro ("text db text?,'$'"), il se trouvera toujours dans le segment de code courant (puisque la macro est simplement recopiée par le préprocesseur à l'endroit où elle est invoquée). Il suffit donc de copier cs dans ds :


    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
    ;----------------------Macros-----------------------------------------
       printf macro text?
          local fin, text
          push ds ax dx
     
          push cs                    ; faire pointer ds...
          pop ds                     ; ...vers le segment qui contient les données
     
          mov dx, offset text   ; faire pointer dx vers l'offset des données
     
          mov ah, 09h
          int 21h
     
          pop dx ax ds
          jmp short fin
     
          text db text?,'$'
     
          fin :
       endm
    ;-----------------------------------------------------------------------------
    Ca, normalement, ça marche.

  14. #14
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    C'est niquel, merci beaucoup !
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/04/2010, 06h30
  2. Passage de paramètres à une macro depuis la ligne de commande
    Par Atatorus dans le forum Général VBA
    Réponses: 4
    Dernier message: 05/10/2009, 10h22
  3. Réponses: 7
    Dernier message: 08/06/2006, 14h26
  4. [VB]Passage de paramètre à une macro
    Par LaboClarins dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 16/02/2006, 09h02
  5. [JAVASCRIPT] passage d'argument à une fonction
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/06/2005, 18h17

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