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 16-bits Assembleur Discussion :

Vérifier si tous les caractères d'une chaîne appartiennent à une autre


Sujet :

x86 16-bits Assembleur

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 7
    Points
    7
    Par défaut Vérifier si tous les caractères d'une chaîne appartiennent à une autre
    Bonjour à tous,

    Ca fait maintenant 2 jours que j'essaie de résoudre le problème suivant. Avant de m'arracher tous les cheveux qu'il me reste, j'ai décidé de vous le soumettre.

    J'ai mis au point une fonction permettant de vérifier si tous les caractères d'une chaine fournie par l'utilisateur appartiennent à un ensemble déterminé de caractères de référence. Pour ce faire, elle compare les caractères de la chaine fournie, un à un, à tous les caractères de la chaine de référence et fournie un message indiquant si le caractère vérifié appartient à la chaine de référence ou non.

    Le problème que j'ai est que peut importe si le caractère vérifié est conforme ou non, la fonction retourne un message de non-conformité. Voici le code de la fonction... je vous remercie à l'avance pour vos conseils !!

    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
     
     CHAINELUE DB 30 DUP ('$')    ; Chaine contenant la chaine utilisateur
     
    CARACTERESPERMIS DB '()0123456789+-%*/','$' ; Chaine de référence
     
    	; Fonction qui determine si la chaine de caracteres fournie par l'utilisateur est conforme 
        VERIFIERCARACTERES PROC NEAR 
    		MOV SI,OFFSET CHAINELUE
    		MOV DI,OFFSET CARACTERESPERMIS	
    		ADD SI,2								; On place SI sur le premier caractère de la chaine fournie par l'utilisateur
    		XOR AX,AX								; AX = 00h
    ALT5:	MOV AL,[SI]								; On met dans AL la valeur du caractère contenu dans CHAINELUE[SI]
    		CMP AL,0Dh								; Si c'est caractère CR, ca signifie que toute la chaine de l'utilisateur a été parcourue
    			JE ALT7								; Si toute la chaine est parcourue sans erreur, on affiche un message de confirmation et on quitte la fct
    				CLD								; On parcours la chaine de référence de gauche à droite
    				MOV CX,17						; CX contient le nb de caractères de la chaine de référence, moins le $
    				REPNE SCASB						; On compare le caractère lu de la chaine tapée, à tous les caract. de la chaine de référence, tant que CX>0 et que la caractère n'a pas été trouvé
    					JE ALT6						; Si le caractère est trouvé, on passe au prochain caractère de la chaine tapée et on reboucle
    					AFFICHAGE EXPRESSIONILLEGALE; Sinon, message d'erreur et on quitte de programme
    					JMP SORTIE
    ALT6:	INC SI									; On passe au prochain caractère de la chaine lue et on reboucle
    		JMP ALT5
    ALT7:	AFFICHAGE EXPRESSIONLEGALE
    		RET
        VERIFIERCARACTERES ENDP

  2. #2
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    bonjour, sans meme lire le code, s'il faut tester une valeur 8 bits, et retourner une info en fonction de l'octet d'entrée, il faut utiliser une look up table. c'est le seul moyen reelement performant.

    ce qui permetrait de tester si le caractère de 8 bits est permi ou pas en très peu de code.

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
            org 100h
            call prog_qui_a_besoin_de_tester_une_chaine
            ret
     
    prog_qui_a_besoin_de_tester_une_chaine:
            mov [caractères_permis],lut_de_permission
            mov [chaine_à_tester],chaine_ok
    ;        mov [chaine_à_tester],chaine_erreur ;decommenter pour constater que ça detecte bien un caractère invalide
            call tester_chaine
            cmp al,0
            jne .erreur_caractère_non_permis
    .ok_caractères_permis:
            ret      ;si pas de caractère interdit, on sort du programme naturellement, sans avoir stack overflow
    .erreur_caractère_non_permis:
            call prog_qui_a_besoin_de_tester_une_chaine ;si caracère non permis, on fait un appel reccursif uqi entraine un stack overflow, ça marche!!!
            ret
     
     
    caractères_permis dw ?
    chaine_à_tester dw ?
    chaine_ok db '0123456789',0
    chaine_erreur db '0123456789blablablabla1234thred',0
    lut_de_permission: ;autoriser les caractères '()0123456789+-%*/$'
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
            db 0,0,0,0, 1,1,0,0, 1,1,1,1, 0,1,0,1 ; !"#$%&'()*+,-./
            db 1,1,1,1, 1,1,1,1, 1,1,1,0, 0,0,0,0 ;0123456789:;<=>?
     
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 ;@ABCDEFGHIJKLMNO
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 ;PQRSTUVWXYZ[\]^_
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 ;`abcdefghijklmno
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 ;pqrstuvwxyz{|}~.
     
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
     
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
            db 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0
     
    tester_caractère:
            mov bx,[caractères_permis]
            xlat [bx]
            ret
     
    tester_chaine:
            mov si,[chaine_à_tester]
    .caractère:
            lodsb
            cmp al,0 ;tester si caractère zero, fin de chaine
            je .fin
            call tester_caractère
            cmp al,0 ;si al = 0, caractère interdit
            jne .caractère ;continuer sinon
            inc al ;inventer un code pour dire qu'on à trouvé un caractère interdit
    .fin: ;car sinon, al = 0 à cause du caractère de fin de chaine
            ret ;et on quitte.
    normalement, ça devrait fonctionner comme ça, et etre super hyper plus rapide aussi. chez moi, ça fonctionne nickel

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Merci pour votre suggestion edfed,

    Cependant, étant nouveau en programmation, ma question se voulait à vocation pédagogique. J'ai cherché pendant 2 jours la raison pour laquelle ma procédure ne fonctionne pas. Si j'ai fait appel à l'aide des membres du forum, c'est bien pour me donner une piste de solution pour trouver mon erreur.

    Votre procédure me semblant sophistiquée, j'ai l'impression que vous êtes un programmeur assembleur aguéri. Peut-être pourriez-vous m'aider dans la recherche de mon erreur ! Merci à l'avance !

  4. #4
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    je veu bien aider à trouver, mais il manque du code.

    si je peux donner un conseil, il faut eviter d'ecrire le code tout en majuscule.
    les majuscules, c'est bon pour les constantes ou les valeurs particulières, type MB_OK en win32. et l'indentation n'aide pas à lire le code, l'assembleur, c'est pas du xml ou du java.

    à première vue, il manque l'etiquette SORTIE, et il faut donner une valeur au segment es pour l'instruction scasb. cette dernière lit l'octet présent à [es:di], rep ne fait que repeter cette instructions un nombre de fois declaré dans cx.

    rep doit etre utilisé dans la version repZ ou repE car on ne sort que lorsque le compteur cx est à zero, ou que la comparaison donne une non égalité.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Bonjour edfed,

    Merci pour le commentaire concernant les majuscules, j'y ai remédié. J'ai lu à une certaine occasion du code assembleur écrit en majuscule et j'ai cru que c'était la norme. J'ai aussi corrigé l'indentation.

    J'ai joint à ce post le code complet de mon programme incluant les deux procédures qu'il contient. Je vous rappelle que c'est la deuxième procédure qui me pose problème. Merci beaucoup pour votre aide !!!!


    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
    pile segment stack
        dw 100 dup (?)
        basepile equ this word
    pile ends 
     
    ;----------------------------------------------------------------------------------------     
     
    affichage macro chaine                  ; macro d'affichage des chaines de caracteres
        mov dx,offset chaine
        mov ah,09h
        int 21h
    endm
     
    affichagenombre macro nombre        ; macro d'affichage des nombres
    	mov dl,nombre 
    	mov ah,02h 
    	int 21h 
    endm
     
    ;----------------------------------------------------------------------------------------
     
    data segment   
        ; variables de type chaines de caractères pour affichage
        ligne_decorative db 13,10,'------------------------------------------------',13,10,'$'
        retour db 13,10,'$'
        titre db 13,10,"Traitement d'une operation arithmetique",13,10,'$'
        question db 13,10,"svp veuillez entrer l'expression a evaluer : $" 
        erreurbalance db 13,10,"faux... expression mal balancee... fin du programme",13,10,'$'
        balancecorrecte db 13,10,"vrai... expression balancee",13,10,'$'
        expressionlegale db 13,10,"expression legale",13,10,'$'
        expressionillegale db 13,10,"expression illegale... fin du programme",13,10,'$'
        nombrecouples db 13,10,'nombre de couples de parantheses : $'
     
        chainelue db 30 dup ('$')    ; chaine contenant la chaine utilisateur
     
        nbcouples db 30h
        originepile dw 0
        caracterespermis db '()0123456789+-%*/','$'
    data ends  
     
    code segment
        assume cs:code, ds:data, ss:pile   
     
    main:
        mov ax, data    ; initialise le segment de donnees
        mov ds, ax
        mov es, ax
        mov ax, pile
        mov ss, ax      ; initialise le segment de pile  
        mov sp,basepile
     
        affichage ligne_decorative  ; affichage du texte d'introduction
        affichage titre  
        affichage ligne_decorative 
        affichage question
     
        mov dx,offset chainelue     ; entree du nombre a traiter, qu'on met dans dx
        mov ah,0ah                  
        int 21h 
     
        affichage retour
        call verifierbalancement
        call verifiercaracteres
        affichage nombrecouples
        affichagenombre nbcouples
     
        ;----------------------------------------------------------------------------------------           
     
    sortie: mov ah,1                ; sortie du programme apres appui d'une touche  
            int 21h                               
            mov ah,4ch      
            int 21h 
     
        ;------------ bloc des fonctions --------------------------------------------------------
     
        ; fonction qui determine si l'expression est balancee et qui determine le nb de couples de parantheses  
        verifierbalancement proc near 
    	mov originepile,sp			; originepile contient l'adresse d'origine de la base de la pile
    	mov dx,offset chainelue
            mov si,dx        
            inc si					; si pointe sur l'indicateur de longueur de chaine
            mov cl,[si]			        ; nb de boucles dans fct de conversion = nb de caracteres
    bcl1: inc si                                  ; si pointe maintenant sur le premier caractere de la chaine 
    	xor bx,bx
            mov bl,[si]                          ; on met le caractère à traiter dans bl      
            cmp bl,28h                          ; si caractere lu est paranthese ouvrante (28h)                                                                                              
            jne alt1
            add nbcouples,1            	; on ajoute 1 au decompte des couples      
            push bx			        ; on pousse la paranthese ouvrante dans la pile
            jmp alt3          			; et on reboucle
    alt1:  cmp bl,29h                         ; si caractere lu est paranthese fermante (29h) 
            jne alt3 				; sinon, on reboucle
            cmp sp,originepile         	; on verifie si la pile est vide  
            jne alt2				; si sp <= basepile, la pile n'est pas vide
            affichage erreurbalance         ; si pile est vide, on affiche message d'erreur
            jmp sortie                           ; puis on quitte
    alt2:  pop ax 				; la pile n'étant pas vide, on dépile un caractère								 
            cmp ax,0028h
            je alt3				; si le caractère lu est ')', on reboucle sans erreur
            affichage erreurbalance         ; si la valeur dépilée != ), on affiche message d'erreur
            jmp sortie                           ; puis on sort      
    alt3:  loop bcl1
            cmp sp,originepile			; quand le bouclage est termine, on vérifie si la pile est vide
            je  alt4				; si oui, on affiche message de confirmation et on quitte
            affichage erreurbalance         ; si pile n'est pas vide, on affiche message d'erreur
    	jmp sortie
    alt4:	affichage balancecorrecte	; si tout s'est bien passe, message de reussite
    	ret
        verifierbalancement endp	
     
    	; fonction qui determine si la chaine de caracteres fournie par l'utilisateur est conforme 
        verifiercaracteres proc near 
    	mov si,offset chainelue
    	mov di,offset caracterespermis	
    	add si,2					; on place si sur le premier caractère de la chaine fournie par l'utilisateur
    	xor ax,ax					; ax = 00h
    alt5:  mov al,[si]					; on met dans al la valeur du caractère contenu dans chainelue[si]
    	cmp al,0dh					; si c'est caractère cr, ca signifie que toute la chaine de l'utilisateur a été parcourue
    	je alt7					; si toute la chaine est parcourue sans erreur, on affiche un message de confirmation et on quitte 
    	cld						; on parcours la chaine de référence de gauche à droite
    	mov cx,17					; cx contient le nb de caractères de la chaine de référence, moins le $
    	repne scasb				; on compare le caractère lu de la chaine tapée, à tous les caract. de la chaine de référence, tant que cx>0 et que la caractère n'a pas été trouvé
    	je alt6					; si le caractère est trouvé, on passe au prochain caractère de la chaine tapée et on reboucle
    	affichage expressionillegale            ; sinon, message d'erreur et on quitte de programme
    	jmp sortie
    alt6: inc si						; on passe au prochain caractère de la chaine lue et on reboucle
    	jmp alt5
    alt7:	affichage expressionlegale
    	ret
        verifiercaracteres endp 
     
        code ends       
    end main

  6. #6
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    je pense que la pile n'est pas equilibrée à cause des jmp sortie à l'interieur des procedures.

    j'ai testé comme ça, et ça marche.

    Code fasm : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    format MZ
    entry text:main
    segment pile
    rw 300
    basepile:
    ;----------------------------------------------------------------------------------------     
     
     macro affichage chaine {                 ; macro d'affichage des chaines de caracteres
        mov dx,chaine
        mov ah,09h
        int 21h
    }
     
    macro affichagenombre nombre {        ; macro d'affichage des nombres
            mov dl,nombre 
            mov ah,02h 
            int 21h 
    }
     
    ;----------------------------------------------------------------------------------------
     
    segment idata
        ; variables de type chaines de caractères pour affichage
        ligne_decorative db 13,10,'------------------------------------------------',13,10,'$'
        retour db 13,10,'$'
        titre db 13,10,"Traitement d'une operation arithmetique",13,10,'$'
        question db 13,10,"svp veuillez entrer l'expression a evaluer : $" 
        erreurbalance db 13,10,"faux... expression mal balancee... fin du programme",13,10,'$'
        balancecorrecte db 13,10,"vrai... expression balancee",13,10,'$'
        expressionlegale db 13,10,"expression legale",13,10,'$'
        expressionillegale db 13,10,"expression illegale... fin du programme",13,10,'$'
        nombrecouples db 13,10,'nombre de couples de parantheses : $'
     
        chainelue db 30 dup ('$')    ; chaine contenant la chaine utilisateur
     
        nbcouples db 30h
        originepile dw 0
        caracterespermis db '()0123456789+-%*/','$'
     
    segment text
     
    main:
        mov ax, idata    ; initialise le segment de donnees
        mov ds, ax
        mov es, ax
        mov ax, pile
        mov ss, ax      ; initialise le segment de pile  
        mov sp, basepile
     
        affichage ligne_decorative  ; affichage du texte d'introduction
        affichage titre  
        affichage ligne_decorative 
        affichage question
     
        mov dx, chainelue     ; entree du nombre a traiter, qu'on met dans dx
        mov ah,0ah                  
        int 21h 
     
        affichage retour
        call verifierbalancement
        call verifiercaracteres
        affichage nombrecouples
        affichagenombre [nbcouples]
     
        ;----------------------------------------------------------------------------------------           
     
    sortie: mov ah,1                ; sortie du programme apres appui d'une touche  
            int 21h                               
            mov ah,4ch      
            int 21h 
     
        ;------------ bloc des fonctions --------------------------------------------------------
     
        ; fonction qui determine si l'expression est balancee et qui determine le nb de couples de parantheses  
    verifierbalancement:
            mov [originepile],sp                      ; originepile contient l'adresse d'origine de la base de la pile
            mov dx,chainelue
            mov si,dx        
            inc si                                  ; si pointe sur l'indicateur de longueur de chaine
            mov cl,[si]                             ; nb de boucles dans fct de conversion = nb de caracteres
    .bcl1: inc si                                  ; si pointe maintenant sur le premier caractere de la chaine
            xor bx,bx
            mov bl,[si]                          ; on met le caractère à traiter dans bl      
            cmp bl,28h                          ; si caractere lu est paranthese ouvrante (28h)                                                                                              
            jne .alt1
            add [nbcouples],1                 ; on ajoute 1 au decompte des couples
            push bx                         ; on pousse la paranthese ouvrante dans la pile
            jmp .alt3                                ; et on reboucle
    .alt1:  cmp bl,29h                         ; si caractere lu est paranthese fermante (29h)
            jne .alt3                                ; sinon, on reboucle
            cmp sp,[originepile]              ; on verifie si la pile est vide
            jne .alt2                                ; si sp <= basepile, la pile n'est pas vide
            affichage erreurbalance         ; si pile est vide, on affiche message d'erreur
            jmp .sortie                           ; puis on quitte
    .alt2:  pop ax                           ; la pile n'étant pas vide, on dépile un caractère
            cmp ax,0028h
            je .alt3                         ; si le caractère lu est ')', on reboucle sans erreur
            affichage erreurbalance         ; si la valeur dépilée != ), on affiche message d'erreur
            jmp .sortie                           ; puis on sort
    .alt3:  loop .bcl1
            cmp sp,[originepile]                      ; quand le bouclage est termine, on vérifie si la pile est vide
            je  .alt4                                ; si oui, on affiche message de confirmation et on quitte
            affichage erreurbalance         ; si pile n'est pas vide, on affiche message d'erreur
            jmp .sortie
    .alt4:   affichage balancecorrecte       ; si tout s'est bien passe, message de reussite
    .sortie:
            ret
     
     
            ; fonction qui determine si la chaine de caracteres fournie par l'utilisateur est conforme 
    verifiercaracteres:
            mov si,chainelue
            mov di,caracterespermis
            add si,2                                        ; on place si sur le premier caractère de la chaine fournie par l'utilisateur
            xor ax,ax                                       ; ax = 00h
    .alt5:  mov al,[si]                                      ; on met dans al la valeur du caractère contenu dans chainelue[si]
            cmp al,0dh                                      ; si c'est caractère cr, ca signifie que toute la chaine de l'utilisateur a été parcourue
            je .alt7                                 ; si toute la chaine est parcourue sans erreur, on affiche un message de confirmation et on quitte
            cld                                             ; on parcours la chaine de référence de gauche à droite
            mov cx,17                                       ; cx contient le nb de caractères de la chaine de référence, moins le $
            repne scasb                             ; on compare le caractère lu de la chaine tapée, à tous les caract. de la chaine de référence, tant que cx>0 et que la caractère n'a pas été trouvé
            je .alt6                                 ; si le caractère est trouvé, on passe au prochain caractère de la chaine tapée et on reboucle
            affichage expressionillegale            ; sinon, message d'erreur et on quitte de programme
            jmp .sortie
    .alt6: inc si                                            ; on passe au prochain caractère de la chaine lue et on reboucle
            jmp .alt5
    .alt7:   affichage expressionlegale
    .sortie:
            ret

    bon courage pour la suite.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 14
    Points : 7
    Points
    7
    Par défaut
    Tout fonctionne !
    je pense que la pile n'est pas equilibrée à cause des jmp sortie à l'interieur des procedures.

    Vous aviez tout à fait raison ! Je supposait qu'à la fin de ma première procédure la pile était revenue à son état original, ce qui n'était pas vrai... car j'appelais la macro d'affichage avant de quitter la première procédure pour entrer dans la seconde.

    Il a suffit que je fasse: avant de quitter la première procédure pour que tout rentre dans l'ordre

    Merci beaucoup pour votre aide !!

  8. #8
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    ha ouais, j'avais meme pas remarqué ça. bien vu .

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

Discussions similaires

  1. [E-03] Vérifier que tous les caractères sont des chiffres
    Par neiluj26 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/03/2009, 11h48
  2. Réponses: 3
    Dernier message: 02/09/2008, 11h54
  3. Lire les caractères un par un d'une chaîne unicode
    Par vanbesienv dans le forum Général Python
    Réponses: 4
    Dernier message: 09/03/2008, 14h09
  4. Trouver la position d'une chaîne dans une chaîne
    Par taka10 dans le forum Langage
    Réponses: 1
    Dernier message: 03/01/2007, 23h18
  5. Réponses: 4
    Dernier message: 11/08/2006, 13h47

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