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 :

Nombre de boucles incorrect : où est l'erreur ?


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut Nombre de boucles incorrect : où est l'erreur ?
    Bonsoir tous,
    voici un code simple !?
    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
     
        org  0x100        ; .com files always start 256 bytes into the segment
    ;------------------------------------------------------------
    %macro	printString 1
    	mov dx, %1
    	mov  ah, 0x09		;
    	int  0x21            	; call dos "print string"
    %endmacro
    ;-------------------------------------------------------------
    %macro	waitTillKeyPressed 0
    	mov ax, 0x0c00
    	int 0x21	; flush buffer; doesn't read standard input (al=0)
    	mov ah, 0x00
    	int 0x16	; BIOS : wait for keyboard input
    %endmacro
    ;-------------------------------------------------------------
        section	.data
     
    borneInf	dw	0x0002
    borneSup	dw	0x0006
     
    msg_borne_inf	db 0x0a,0x0d,"borne inferieure atteinte",'$'
    msg_inter	db 0x0a,0x0d,"entre 2 bornes",'$'
    msg_borne_sup	db 0x0a,0x0d,"borne superieure atteinte",'$'
     
        section	.text
     
    start:
    	xor ax, ax	;ax = 0
    	mov cx, 0x000a	; count
    loop:
    	cmp word [borneInf], ax
    	jnz suite
    	printString msg_borne_inf
    loop2:
    	inc ax
    suite2:
    	dec cx
    	jz fin
    	cmp word [borneSup], ax
    	jz suite2
    	printString msg_inter
    	jmp loop2
    fin:
    	printString msg_borne_sup
    	jmp quit
    suite:
    	inc ax
    	dec cx
    	jnz loop
    quit:
    	mov  ah, 0x4c     ; "terminate program" sub-function
        	int  0x21         ; call dos services
    borneSup-borneInf = 6-2 = 4
    les tests JZ enlèvent 1 : 4-1=3
    "entre 2 bornes" devrait donc être affiché 3 fois; or il s'affiche 7 fois !!!
    Quelqu'un peut-il me dire où se situe l'erreur ?

  2. #2
    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
    Salut,

    Ce n'est pas parce qu'un code est court qu'il est simple
    Alors...
    CX est utilisé comme compteur, et commence avec la valeur 10
    AX est utilisé comme... valeur à tester et commence avec la valeur 0

    comme la première valeur à tester : BorneInf = 2, ton programme fait 2 boucles à vide
    puis AX=2 et CX=8, et là tu affiche le message : "borne inférieure atteinte"
    Et là ça part en sucette car ta macro utilise AH donc ton AX= 0902h juste après

  3. #3
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    L'erreur est dans cette affirmation :
    voici un code simple !?


    Non sans rire, c'est parce que tu te bases sur l'état de CX pour sortir de loop2 (la boucle qui permet d'afficher msg_inter), d'ailleurs pourquoi CX ??? À quoi sert-il ?

  4. #4
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Merci à tous ; j'avais oublié la macro.

    Pourquoi CX ? Eh bien je dirais pourquoi pas ?

    Ce que j'ai posté n'est qu'un petit bout de code séparé dont je voulais tester la validité.

    J'utilise NASM et je voudrais bien pouvoir déboguer mes programmes (.com).
    Quels outils me conseillez-vous ?

  5. #5
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Points : 550
    Points
    550
    Par défaut
    Ce que je voulais savoir c'est pourquoi utiliser CX en parallèle avec AX, alors que c'est ce qu'il y a dans AX qui semble être l'objet de toute tes attentions ?

    Et sinon comme debogueur j'utilise mon cerveau (et eventuellement un bout de papier) pour simuler ce qui doit se passer mais ce n'est pas un outil très fiable...
    Jadis, je me souviens avoir utilisé debug, un utillitaire de MS-DOS pour tracer le comportement du programme instruction par instruction.

  6. #6
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Pour debug je fais pareil , a la main ou alors j'affiche a l'écran les valeurs pour être sur que ce sont bien les bonnes.
    en assembleur je m'interesse pas au debuggeur , vu que je vise des machines tres spécifique qui ne possède pas forcément des outils tres avancé pour développer dessus x)

  7. #7
    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
    Pareil que Bifur et Kannagi

    Comme Bifur, l'a dit, tu utilises CX et AX alors que seul AX est utile.

    Et dans un x86, économiser des registres c'est pas du luxe

    Tiens, j'ai pris 10 minutes pour faire une modif (non testée)
    Ok, c'est subjectif, mais je trouve le code plus lisible comme ç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
    50
    51
    52
    53
    54
    55
    56
    org  0x100        ; .com files always start 256 bytes into the segment
    ;------------------------------------------------------------
    %macro	printString 1
        push dx ; sauvegarde registre dx
        push ax ; sauvegarde registre ax
        mov dx, %1
        mov  ah, 0x09		;
        int  0x21            	; call dos "print string"
        pop ax ; restauration registre ax
        pop dx ; restauration registre dx
    %endmacro
    ;-------------------------------------------------------------
    %macro	waitTillKeyPressed 0
        push ax ; sauvegarde registre ax
        mov ax, 0x0c00
        int 0x21	; flush buffer; doesn't read standard input (al=0)
        mov ah, 0x00
        int 0x16	; BIOS : wait for keyboard input
        pop ax ; restauration registre ax
    %endmacro
    ;-------------------------------------------------------------
        section	.data
     
    borneInf	dw	0x0002
    borneSup	dw	0x0006
     
    msg_borne_inf	db 0x0a,0x0d,"borne inferieure atteinte",'$'
    msg_inter	db 0x0a,0x0d,"entre 2 bornes",'$'
    msg_borne_sup	db 0x0a,0x0d,"borne superieure atteinte",'$'
     
        section	.text
     
    start:
    	xor ax, ax	;ax = 0
    boucle:
    	cmp [borneSup], ax
    	jnz pasSup
    	printString msg_borne_sup
    	jmp quit
    pasSup:
     
    	cmp [borneInf], ax
    	jnz pasInf
    	printString msg_borne_inf
    pasInf:
     
    	jns tropPetit
    	printString msg_inter
    tropPetit:
     
    	inc ax
    	jmp boucle
     
    quit:
    	mov  ah, 0x4c     ; "terminate program" sub-function
        	int  0x21         ; call dos services

  8. #8
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Ton code est superbe Forthman et je t'en remercie

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/11/2017, 16h21
  2. Message d'erreur nombre d'arguments incorrect
    Par denkae75 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/08/2016, 16h34
  3. Où est mon erreur dans la boucle Do-While ?
    Par Novice72 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 21/06/2015, 20h28
  4. Formule incorrecte. Où est l'erreur?
    Par guiboury dans le forum Mathématiques - Sciences
    Réponses: 3
    Dernier message: 19/11/2012, 08h44

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