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 :

Saut avec ou sans condition


Sujet :

Assembleur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Saut avec ou sans condition
    Re-salut,

    Voila j'essaye de creer un programme de mot de passe tout ce qu'il y a de basic. Apres la saisie de la chaine (du mot de passe) j'ai inclus l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    JE affiche 
    JMP passe
    Si le mot de passe est exact (il y a CMP juste avant) le programme devrait aller a "affiche" plus bas, si le passe est faux alors le programme retourne a la saisie.
    Pendant la compilation il y a une erreur "Data below initial CS:IP defined". Quelque soit le programme où je mets un type de JMP le compilateur m'affiche le meme message. Quelqu'un a une idée ?

    Merci d'avance .

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je vois que le monde de l'assembleur t'attire, tu as raison, c'est un vieux langage mais qui est tellement magnifique

    A mon avis ça doit bêtement être un problème de déclaration de ton CS (Code segment). Soit tu l'initialises mal, soit tu l'initialises au mauvais endroit, ce qui est à mon avis plus probable ;-)

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Oui j'adore l'assembleur, meme si c'est pas facile au début héhé. J'ai initialisé CS dans le même segment que DS et SS. Pour un fichier .COM c'est ce qu'il faut faire non ? enfin je crois .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    .386
     
    fichier segment use16
     
    assume CS:fichier, DS:fichier, SS:fichier



    C'est comme ça que c'est écrit dans le mini-cours que j'ai .

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    L'initialisation de CS est bonne selon le cours que j'ai, mais il y a un probleme avec CS:IP. Apparemment JMP ou/et JE ne pointent pas dans le segment (enfin c'est ce que je pense, car j'y connais pas grand chose). Alors je vais poster le code...(désolé pour ceux qui aiment pas ma méthode de programmation, ca ira mieux dans quelques années ):

    2478 c'est le mot de passe

    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
    .386
     
    fichier segment use16
     
    assume CS:fichier, DS:fichier, SS:fichier
     
    org 100h
     
    debut:
     
    ecran db 50 dup ('$')
     
      mov AX,2478
      push AX
      push BX
      push CX
     
      mov AH,3fh                           ;saisie du mot de passe
      mov BX,0
      mov DX,offset ecran
      mov CX,49
      int 21h
     
      pop CX
      pop BX
      pop AX
      cmp AX,DX                            ;vérifie le mot de passe
      je message
      jmp debut
     
    message:
     
    affiche db 10,13,'Ok merci','$'
     
      mov AH,09h                           ;affichage de fin
      mov DX,offset affiche
      int 21h
     
    ret
     
    fichier ends
     
    end message
     
    end debut

  5. #5
    Invité
    Invité(e)
    Par défaut
    Hello,

    2-3 petites informations qui pourront t'être utiles :

    .386
    Ca, ça sert pas à grand chose dans ton cas...
    assume CS:fichier,DS:fichier,SS:fichier
    Il me parait beaucoup plus simple et plus clair de faire à la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    .MODEL SMALL ; déclaration du modèle de données
    .STACK           ; taille de la pile
    .DATA             ; variables
    .CODE             ; code du programme
    Et étant donné que seul le segment de données doit être initialisé (CS et SS le sont automatiquement), tu fais ceci dans le .CODE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MOV AX,@DATA
    MOV DS,AX
    ORG 100H
    Je vois vraiment pas l'utilité de lui dire de commencer à 100h...

    mov AH,3fh ;saisie du mot de passe
    mov BX,0
    mov DX,offset ecran
    mov CX,49
    int 21h
    Pourquoi se compliquer la tête à vouloir lire sur le handle 0 ? Utilise la fonction 0AH/21H

    Je crois que déjà en travaillant de cette manière, tu ne devrais plus avoir de problème avec tes segments...

    Quant à ton algo, n'oublie pas que ce que tu vas rentrer comme mot de passe à l'écran est de l'ASCII, il faut donc que tu convertisses le code entré par l'user en hexadécimal avant de faire tes comparaisons....

    Et si tu veux quelques liens :
    http://www.trotek.ec-lyon.fr/~muller.../index.html.fr
    http://www-ipst.u-strasbg.fr/pat/memo8088.htm

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Coucou,

    Question bête, est ce que ça marche pour un .COM ? .

    Je ne sais meme pas a quoi sert .386, c'est juste marqué dans le cours qu'il faut le mettre a chaque fois .

  7. #7
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 946
    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 946
    Points : 59 446
    Points
    59 446
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Frenchghost
    Question bête, est ce que ça marche pour un .COM ?
    En tout cas, ton code est rédigé pour en créer un :
    - Un seul segment pour code, data et stack;
    - La directive
    Citation Envoyé par Frenchghost
    Je ne sais meme pas a quoi sert .386, c'est juste marqué dans le cours qu'il faut le mettre a chaque fois .
    C'est pour pouvoir utiliser les registres 32 bits (ce que tu ne fais pas dans ton code soit dit en passant).

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Merci pour .386, je ne savais pas. Je sais que mon code est pour un .COM , je posais la question au sujet de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    .MODEL SMALL    ; déclaration du modèle de données 
    .STACK           ; taille de la pile 
    .DATA             ; variables 
    .CODE            ; code du programme 
     
     
     
    MOV AX,@DATA 
    MOV DS,AX

  9. #9
    Invité
    Invité(e)
    Par défaut
    Argh, j'avais oublié que tu faisais un .COM
    Mais, dis-moi, tu peux me donner l'url de ce cours ? Car ça doit être un cours assez bizarre de parler de .COM après un seul exercice sur le .EXE, ce cours s'éparpille un peu trop à mon goût

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Il n'y a pas d'exercices dans le cours , j'essaye de faire des petits programmes pour m'entrainer moi-même . Je suis sous TASM, mais tout le monde parle en bien de NASM, alors je l'ai téléchargé et imprimé la documentation en anglais...mais ce n'est pas vraiment un tutoriel; ça va être difficile ! mais j'essaye de m'accrocher lol.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ben si tu veux mon avis, mieux vaut d'abord bien comprendre le fonctionnement des exécutables avant les COM
    As-tu jeté un coup d'oeil sur les url que je t'ai donné plus haut ?
    Si tu veux des idées d'exercices, étant donné que tu as déjà fait un exercice sur la saisie d'une chaîne et l'affichage de celle-ci, pourquoi ne t'intéresses-tu pas aux opérations mathématiques ? Ou alors il y a le très célèbre programme de vérification d'un palindrome qui demande un peu de logique

    A propos de NASM, sache que moi j'utilise TASM et MASM, pour moi ce sont tous un peu les mêmes. Par contre, je trouve le choix du debugger assez intéressant, pour ma part j'utilise TD (Turbo Debugger) qui est vraiment superbe et très explicite.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Ok je vais commencer par ça alors, merci pour les URL, ça donne un complement pour mon cours, je vais potasser ça tout de suite !! .

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Oh oh oh (Imitation du père noël)

    D'abord ! Parce qu'en plus, commencer par un com est une très bonne solution ! Le .com est le cas le plus simple d'un executable. Le .Exe a des trucs en plus et est donc moins général. De ce fait, autant commencer par le moins spécialisé ! Commencer par un .com n'est donc pas abhérent, et pour ce que vous voulez tester, ca ira très bien ! Et puis ca permet de mettre les idées en place ^^

    Oui j'adore l'assembleur, meme si c'est pas facile au début héhé. J'ai initialisé CS dans le même segment que DS et SS. Pour un fichier .COM c'est ce qu'il faut faire non ? enfin je crois .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    .386 
     
    fichier segment use16 
     
    assume CS:fichier, DS:fichier, SS:fichier
    Je vais tacher de ne me pas tromper, mais ASSUME en anglais ne veut pas dire mettre à. Il veut dire si je ne me trompe pas "considérer". Donc en fait, tu dis juste à l'assembleur "Considère que cs, ds et ss pointent sur ce segment. Ce qui est vous avez raison tout à fait normal, puisque c'est DOS qui les fixe avant d'appeller votre programme. Avec vous déjà essayé :

    Normalement, ca n'existe pas, puisque cette opération est un far jmp.

    Ensuite, venons en au problème :

    Data below initial CS:IP defined
    Ca veut juste dire qu'il y a des données juste après l'initial CS:IP. Normalement, ca ne devrait pas empêcher la compilation, mais TASM doit être assez taquin ! Quoiqu'il en soit, ici, il vous sauve la vie, puisqu'il vous explique qu'il y a des données juste après le CS:IP initial. C'est quoi le CS:IP initial ? Il est défini ici :

    Donc, le programme commencera à Début ! Label bien chosi ! Parce qu'en fait, il n'y a pas d'en tête aux fichiers com ! Qui dit pas d'en tête dit où je commence ? Obligatoirement à une adresse fixée par une convention. Cette adresse est 100. Mais comme toutes les conventions sont stupides, celle veut juste dire au début du programme, puisque les 100 premiers octets sont réservés par DOS Donc, il commencera à l'adresse 100, c'est à dire donc bien à début.

    Et si on jette un coup d'oeil plus attentif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    debut: 
     
    ecran db 50 dup ('$')
    Ben, c'est quoi ces données définies juste au début du programme ? En fait, si le programme devait réussir à être assemblé, il y aurait des '$' au tout début, et je ne sais pas à quoi ca correspond comme instruction, mais ca n'est certainement pas ce que tu veux.

    Finalement, rien de très grave, vous devez juste mettre les données... ailleurs ! par exemple :

    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 
     
    fichier segment use16 
     
    assume CS:fichier, DS:fichier, SS:fichier 
     
    org 100h 
     
    debut: 
     
      mov AX,2478 
      push AX 
      push BX 
      push CX 
     
      mov AH,3fh                           ;saisie du mot de passe 
      mov BX,0 
      mov DX,offset ecran 
      mov CX,49 
      int 21h 
     
      pop CX 
      pop BX 
      pop AX 
      cmp AX,DX                            ;vérifie le mot de passe 
      je message 
      jmp debut 
     
    [color=red]  ecran db 50 dup ('$') ; ICI[/color]
     
    message: 
     
    affiche db 10,13,'Ok merci','$' 
     
      mov AH,09h                           ;affichage de fin 
      mov DX,offset affiche 
      int 21h 
     
    ret 
     
    [color=red]  ecran db 50 dup ('$') ; OU ICI[/color]
     
     
    fichier ends 
     
    end message 
     
    end debut
    Sinon, petite question : Il sert à quoi le end message ?


    Blustuff.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Oui c'est vrai, end message ne sert a rien . Merci pour vos réponses, l'instruction JE et JMP ne bloque plus le compilateur maintenant, encore merci !

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Petite remarque au fait ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      je message 
      jmp debut 
     
    message:
    c'est pareil que :

    dans le cas ou tu ne met pas les données entre deux, bien sûr ^^

  16. #16
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    En parlant de petite remarque :

    Citation Envoyé par Blustuff
    Cette adresse est 100. Mais comme toutes les conventions sont stupides, celle veut juste dire au début du programme, puisque les 100 premiers octets sont réservés par DOS Donc, il commencera à l'adresse 100, c'est à dire donc bien à début.
    les 100h premiers donc les 256 premiers....
    et pi c pas si debile, ca permet d'avoir le PSP a porté de main ce qui n'est pas vraiment le cas d'un .exe...
    la rapidité pr recupere la ligne de commande(CS:80h) est bien meilleure !!

    bon daccord tout le monde s'en fou alors bonne année et A+

    TangiX

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Mais non ! j'ai oublié des mots lol. Je voulais dire "Mais comme toutes les conventions sont stupides, il y a une bonne raison à celle là", puisque je l'explique ^^. Mais bon, l'âge et tout font que ... ben voilà...

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

Discussions similaires

  1. [Toutes versions] Problème de syntaxe avec MERGEFIELD et condition Si ALORS et saut de ligne
    Par dany13 dans le forum Word
    Réponses: 1
    Dernier message: 23/07/2013, 13h55
  2. Réponses: 1
    Dernier message: 24/04/2008, 09h07
  3. Saut de ligne sans <br/>
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 21/06/2007, 11h21
  4. [CR][ASP.Net] Incohérence PageNumber avec/sans condition
    Par SoaB dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/01/2006, 12h10
  5. [C#] [EXCEL] Travailler avec EXCEL sans ouvrir le logiciel
    Par Fabsou dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/07/2004, 10h29

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