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 :

Passage par la pile


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Passage par la pile
    Bonjour, j'ai un problème dans mon code assembleur ce que je veux faire et la somme des N premiers entiers que l'on définit dans le data segment. De plus je suis pas sur que pour l'affichage d'un entier on puisse faire une interruption 09h. Ci-dessous le code si quelqu'un peut m'aider cela serait fort sympathique.
    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
    PILE SEGMENT STACK
    DB 256 DUP(?)
    PILE ENDS
     
    DONNEES SEGMENT
    TAB DW 10,5,1,8,2,6,12,10,4,2,6
    N DW 2
    RESULTAT DW 0
     
    DONNEES ENDS
     
    CODE SEGMENT
    ASSUME CS:CODE, DS:DONNEES
     
    EXO PROC FAR
     
    MOV AX,DONNEES
    MOV DS,AX
    ;
    MOV CX, N ; on met Taille dans CX
    MOV BX, RESULTAT
    PUSH CX ; on met CX sur la pile
    PUSH BX ; on met AX sur la pile
     
    CALL Somme ; on appelle Somme
     
    PUSH BP
    MOV BP,SP
    MOV BX,[BP+2]
     
     
    MOV AH,02h
    MOV DX,BX
    INT 21h
     
     
    MOV AH,4CH ;interruption de fin de programme
    INT 21h
    RET
     
     
    EXO ENDP
     
    Somme PROC NEAR
    ;Recuperaton des variables sur la pile
    PUSH BP
    MOV BP,SP
     
    MOV CX, [BP+4]
    DEC CX
    MOV AX, [BP+6]
     
    CMP CX,0
    JE Tab0
    MOV SI, CX
    MOV BX, TAB[SI]
    ADD AX,BX
    PUSH CX
    PUSH AX
    CALL Somme
     
    Tab0:
    PUSH AX
    MOV DX,BX
    MOV AH,9
     
    INT 21h
    ;MOV AH,4CH ; Interruption de fin de programme
    ;INT 21h
    RET
     
    Somme ENDP
     
    CODE ENDS
    END EXO

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Points : 13
    Points
    13
    Par défaut pile
    j'ai un problème a l'affichage mais aussi pour revenir au programme principale

  3. #3
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Salut,

    Tu devrais commenter ton programme pour qu'on puisse comprendre ce que tu veux faire, c'est fatigant de deviner à quelles variables tu essaies d'atteindre par la pile etc.
    Au début tu peux pousser tes variables plus simplement :
    Ensuite dans les commentaires tu appelles N taille, et dans ton message tu dis que le but est de calculer la somme des N premiers entiers. Soit tu utilises un paramètre pour savoir où tu dois t'arrêter de compter dans la procédure, soit tu t'arrêtes à un caractère précis comme 0 (d'ailleurs c'est ce que tu fais dans Somme on dirait).

    Je ne vois pas comment Somme pourrait fonctionner correctement, elle n'arrête pas d'empiler et de s'appeler elle-même et ensuite il n'y a rien pour restaurer la pile. Réécris-la en évitant le "call Somme".

    Voilà ce dont Somme a besoin pour fonctionner a priori :
    • L'adresse du premier élément du tableau
    • Elle peut recevoir l'adresse d'une variable où ranger la somme ou la retourner dans AX
    • Elle doit savoir où s'arrêter
    Ensuite il suffit d'accéder au premier élément avec son adresse, de l'ajouter au résultat, d'ajouter deux à l'adresse, d'ajouter le deuxième élément etc. jusqu'à ce qu'on doive s'arrêter.

    Pour pouvoir afficher ton nombre : http://developpez.net/forums/showpos...75&postcount=3.
    :wq

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Push et commentaire
    Oui dsl pour les commentaires c'est que je corrige depuis un certain temps et donc les commentaires correspondent plus mais je veux faire une procédure récursive c'est pour sa que je fais call Somme a la fin. De plus j'empile et j'empile a chaque fois mais faut que je restaure a la fin ce que j'ai pas fait car je vois pas comment revenir au truc initial a la fin ds le "main"

  5. #5
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Tu as déjà codé la fonction en itératif avant d'essayer ça ?
    Pour les paramètres poussés sur la pile il suffit d'ajouter un opérande à RET. Par exemple si une fonction prend deux paramètres de deux octets chacun, tu écris RET 4 et ça remettra la pile dans le bon état. Avant ça il faut penser à restaurer les registres sauvegardé comme BP en utilisant POP.
    :wq

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Itératif
    Ouep itératif j'ai pas de problème c'est pas plus compliqué qu'en C juste un peu plus de ligne mais sinon ouep l'itératif fonctionne

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Code modifié Pile en DW
    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
    PILE        SEGMENT STACK
    	    DW      256 DUP(?)
    PILE        ENDS
     
    DONNEES     SEGMENT
    	TAB DW 10,5,1,8,2,6,12,10,4,2,6
    	N DW 2
    	RESULTAT DW 0
     
    DONNEES      ENDS
     
    CODE        SEGMENT
    	    ASSUME   CS:CODE, DS:DONNEES
     
    EXO2    	PROC     FAR
     
    	    MOV      AX,DONNEES
    	    MOV      DS,AX
    	    ;
    	    MOV CX, N 				; on met N dans CX
    		MOV BX, RESULTAT        ; on met RESULTAT dans BX
    	    PUSH CX					; on met CX sur la pile
    		PUSH BX                 ; on met AX sur la pile   
     
    	    CALL Somme			; on appelle Somme
     
    	    PUSH BP
    		MOV BP,SP
    		MOV AL,[BP+2]
     
    		MOV DL, AL
            OR DL, 30h       ; conversion en caractère ASCII
            MOV DL, 02h
            INT 21h
     
    		MOV AH,4CH				;interruption de fin de programme
    		INT 21h
    		RET		
     
     
    EXO2       ENDP
     
    Somme PROC NEAR
    	;Recuperaton des variables sur la pile
    	PUSH BP						
    	MOV BP,SP					
     
    	MOV CX, [BP+4]; on met N dans CX			 	
    	DEC CX; on décrémente CX pour faire face a l'indice 0 du tableau					
    	MOV AX, [BP+6]; on met Resultat dans AX
     
    	CMP CX,0 ; on compare CX à 0
    	JE Tab0; si c'est égal on jump 
    	MOV SI, CX;on met CX dans SI
    	MOV BX, TAB[SI]; on met le contenu de TAB[SI] dans BX soit le nombre
    	ADD AX,BX;on additionne BX et AX resultat dans AX  
    	PUSH CX; on push CX  
    	PUSH AX; on push AX
    	CALL Somme ;on appelle Somme
     
    Tab0:
     
        PUSH AX	
        RET
     
    Somme ENDP
     
    CODE        ENDS
    	    END EXO2

Discussions similaires

  1. Problème très rapide de passage par référence
    Par Noxexplorer dans le forum ASP
    Réponses: 2
    Dernier message: 23/06/2005, 10h02
  2. passage par zéro du laplacien
    Par tlemcenvisit dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/06/2005, 09h58
  3. [Debutant(e)]passage par adresse?
    Par cap2fosse dans le forum Langage
    Réponses: 4
    Dernier message: 24/09/2004, 10h05
  4. passage par session_OnEnd
    Par drinkmilk dans le forum ASP
    Réponses: 4
    Dernier message: 06/05/2004, 11h28
  5. [VB6]Passage par référence d'une prop. d'objet à une fct
    Par -gYs- dans le forum VB 6 et antérieur
    Réponses: 15
    Dernier message: 02/09/2002, 08h55

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