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 32-bits / 64-bits Assembleur Discussion :

variable à zero


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 50
    Points
    50
    Par défaut variable à zero
    Bonjour à tous , je suis entrain de tester les structure de controle avec nasm, et pour cela je m' "amuse" à faire un programme qui effectue des opérations de bases .
    Le programme demande a l utilisateur d'entrer deux nombre que j'initialise au préalable avec resd 1 .

    ensuite je demande à l utilisateur de faire un choix entre 1 et 4 pour l’opération et selon le choix je fais un saut à la sous parti qui traite l'operation.

    Le problème c'est qu'un des deux nombres normalement sauvegardé en mémoire se met à zéro sans que je n y ai touché et j avoue que je n' y comprend rien,car mon autre valeur est bien conservé .

    Si vous avez le temps d'y jeter un coup d’œil ce serait sympa, le probleme se trouve dans bloc_addition à la ligne 125 .

    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
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
     
    ; nasm -f win32 operations.asm 
    ; gcc -o test calcul.o operations.obj asm_io.obj
     
    %include "asm_io.inc"
    %define NL 10
    ;
    ; initialized data is put in the .data segment
    ;
    segment .data
    ;
    ; These labels refer to strings used for output
    ;
     
    choixNum1 db    "Entrez un premier numero: ", 0     
    choixNum2 db    "Entrez un deuxieme numero: ", 0 
    choixOperation db "Choissisez l'operation",0
    choixAdd db "Tapez 1 pour l'addition ",0
    choixSub db "Tapez 2 pour la soustraction ",0
    choixMul db "Tapez 3 pour la multiplication ",0
    choixDiv db "Tapez 4 pour la division ",0
    choix db "Votre choix :  ",0
     
    moins db " - ",0
    plus db " + ",0
    fois db " * ",0
    divise db " / ",0
    egal db " = ",0
     
    nl db NL,0
     
     
    ;
    ; uninitialized data is put in the .bss segment
    ;
    segment .bss
    ;
    ; These labels refer to double words used to store the inputs
    ;
     
    choixCalcul resb 1
    num1 resd 1
    num2 resd 1	
     
    ;
    ; code is put in the .text segment
    ;
    segment .text
            global  _asm_calculatrice
    _asm_calculatrice:
            enter   0,0               ; setup routine
            pusha
     
    	; --------------------------------Choix du nombre 1 --------------------------------	
     
    	mov     eax, choixNum1      
            call    print_string
     
            call    read_int          
            mov     [num1], eax    
     
    	mov	eax,[num1]
    	call    print_nl
    	call    print_int
    	call    print_nl
     
    	; -------------------------------- Choix du nombre 2 --------------------------------	
     
    	mov     eax, choixNum2      
            call    print_string
     
            call    read_int          
            mov     [num2], eax 
     
    	mov	eax,[num2]
    	call    print_nl
    	call    print_int
    	call    print_nl
     
     
    	; -------------------------------- Choix de l'operation -----------------------------
     
    	mov     eax, choixOperation       
            call    print_string
     
    	call    print_nl
     
    	mov     eax, choixAdd     
            call    print_string
     
    	call    print_nl	
     
    	mov     eax, choixSub     
            call    print_string
     
    	call    print_nl	
     
    	mov     eax, choixMul      
            call    print_string
     
    	call    print_nl
     
    	mov     eax, choixDiv     
            call    print_string
     
    	call    print_nl
     
    	mov     eax, choix     
            call    print_string
     
            call    read_int          
            mov     [choixCalcul], eax 	
     
    	cmp	eax,1 			;compare eax à 1
    	jz	bloc_addition
    	cmp	eax,2			;sinon compare eax à 2	
    	jz	bloc_soustraction
    	cmp	eax,3			;sinon compare eax à 3
    	jz	bloc_multiplication
    	cmp	eax,4			;sinon compare eax à 4
    	jz	bloc_division
    	jmp	fin_programme		;sinon passe a la fin
     
     
    bloc_addition:
     
    	mov	eax,[num1]
    	call    print_int
    	mov	eax,plus
    	call    print_string
    	mov	eax,[num2]
    	call    print_int
    	mov	eax,egal
    	call    print_string
     
    	mov	eax,[num1]
    	add	eax,[num2]
    	call    print_int
     
    	call    print_nl	
    	jmp	fin_programme
     
    bloc_soustraction:
     
    	mov	eax,[num1]
    	call    print_int
    	mov	eax,moins
    	call    print_string
    	mov	eax,[num2]
    	call    print_int
    	mov	eax,egal
    	call    print_string
     
    	call    print_nl
    	jmp	fin_programme
     
    bloc_multiplication:	
     
    	mov	eax,[num1]
    	call    print_int
    	mov	eax,fois
    	call    print_string
    	mov	eax,[num2]
    	call    print_int
    	mov	eax,egal
    	call    print_string
     
    	call    print_nl
    	jmp	fin_programme
     
    bloc_division:
     
    	mov	eax,[num1]
    	call    print_int
    	mov	eax,divise
    	call    print_string
    	mov	eax,[num2]
    	call    print_int
    	mov	eax,egal
    	call    print_string
     
    	call    print_nl
    	jmp	fin_programme
     
    fin_programme:
     
     
     
            popa
            mov     eax, 0            ; return back to C
            leave
            ret

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Bonjour,

    Ligne 41, pour « choixCalcul », tu as écrit « resb » et pas « resd ». Tu réserves donc un seul octet pour le choix de l'utilisateur, mais tu y stockes quand même EAX à la ligne 112, qui tient sur 32 bits. Les trois octets supplémentaires vont donc écraser « num1 » qui vient juste après.

    Comme en plus, tu travailles en little endian et que ton choix est compris entre 1 et 4 (donc toujours sur un seul octet), ces trois octets supplémentaires sont toujours nuls. Et comme le seul octet de « num1 » qui ne soit pas écrasé est l'octet de poids fort (pour les mêmes raisons), tu te retrouves avec un paramètre « num1 » toujours nul en pratique (il faudrait qu'il soit supérieur à 16.777.215 pour ne pas être totalement écrasé).

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 50
    Points
    50
    Par défaut
    Ah c'était donc ça je n'ai pas pensé que les variables déclarées se mettaient directement à la suite .
    L'erreur de mettre EAX dans un octet était un peu énorme . Merci bcp !

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    À ton service, mais n'oublie pas .
    Je l'ai fait pour toi cette fois-ci.

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

Discussions similaires

  1. Remettre à zero une variable static
    Par Mchupakabra dans le forum Langage
    Réponses: 1
    Dernier message: 09/06/2008, 19h57
  2. Array, Remise à zero de variable
    Par godjojo dans le forum Langage
    Réponses: 5
    Dernier message: 07/05/2008, 17h08
  3. [BO 6.1] Remise à zero variable sur une rupture
    Par filip50 dans le forum Deski
    Réponses: 7
    Dernier message: 15/11/2007, 16h15
  4. remise a zero de la variable @@nestlevel
    Par lazzeroni dans le forum SQL
    Réponses: 6
    Dernier message: 28/08/2007, 14h46
  5. Effacer folder avec nom variable: zero's + nom variable
    Par chapeau_melon dans le forum VBScript
    Réponses: 2
    Dernier message: 12/07/2007, 20h03

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