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 :

Addition de 2 nombres et affichage des flags CF et OF


Sujet :

x86 16-bits Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Addition de 2 nombres et affichage des flags CF et OF
    Bonjour à tous
    Je dois faire l'addition de deux nombres (sur 8 bits) bit a bit et afficher le résultat de cf et of.
    Mais je n'y arrive pas, je me demande si vous pouvez m'aider c'est très important pour moi.
    Merci d'avance.

  2. #2
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mov ah,nb1
    add ah,nb2
    cf et of sont les bits 0 et 11 du registre eflags

  3. #3
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonsoir,

    Premièrement est-ce que c'est pour processeur X86 ?

    Pour une addtion bit à bit (sans utiliser le mnémonique ADD), il faudra jouer avec les AND et les shifts (SHR surtout) pour extraire les bits et utiliser le XOR pour simuler l'addition.

    0 XOR 0 = 0
    0 XOR 1 = 1
    1 XOR 0 = 1
    1 XOR 1 = 0 (et là on passe la retenue au rang suivant )

    Pour le carry flag et l'overflow il y a plusieurs moyens... Le plus simple est de testé avec des JCC (jump conditionnels) :

    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
     
    JNO NO_OVERFLOW ; JMP if no overflow
     ; ici du code pour montrer qu'il y a eu overflow
     jmp TEST_CARRY
    NO_OVERFLOW :
     ; ici pour montrer qu'il n'y a pas eu d'overflow
     
    TEST_CARRY:
    JNC NO_CARRY
     ; ici du code pour montrer que le carry est armé
     
     jmp fin
    NO_CARRY:
     ;ici du code pour montrer que le carry n'est pas armé
     
    fin:
    seconde méthode, utiliser le registre EFLAGs, on le pousse sur la pile, et on récupère les flags (CF et OF) :

    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
     
    PUSHF ; pousse EFLAG
    pop eax ; recup EFLAG dans EAX
    and eax, 802h ; ne garde que le OF et le CF
    cmp al, 2
    je CF_ARME
     ; pas de CF
     
     jmp TEST_OF
    CF_ARME:
     ; CF est armé
     
    TEST_OF:
     and eax, 800h ; ne garde que le OF
     test eax, eax
     jnz NO_OF
     ; OF armé
     
     jmp fin
    NO_OF :
     ; pas de OF armé
     
    fin:

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Addition de deux nombres bit à bit
    Le programme en assembleur qui fait l'addition de deux nombres bit a bit n'est pas exécutable (au moment de l'exécution il s'affiche un message"entrée un nombre binaire:00000000" et puis se bloque). Je veux savoir où se trouve l'erreur; si vous pouviez m'aider ça serait sympa.

    Voici mon programme:
    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
    data        segment       ;data est le nom du segment de données 
     
    TAB1   DB   8 DUP(?)
    TAB2   DB   8 DUP(?)     
    TAB      DB   8 dup(?)
     
     
     
    mes2   DB   ' faite entrer un nombre  en binaire :$' 
    mes1   DB   ' faite entrer un nombre  en binaire:$' 
    mes    DB   'voici votre resultat:$'
    mes3   DB   'le contenue de CF :1',' $'  
    mes4   DB   'le contenue de CF :0',' $'  
    mes7   DB   'le contenue de OF :1',' $'   
    mes6   DB   'le contenue de OF :0',' $'  
    mes11  DB   'cette operation est non autoriser car le resultat est depace lecapacite:OF=1 & CF=1$' 
     
    data       ends        ;fin du segment de données
     
    CODE      SEGMENT
    		  ASSUME DS:DATA
    		  ASSUME CS:CODE
    		  ASSUME SS:seg_pile
    	 LEC  PROC   near
    		  MOV CX,8
    		  MOV AH,01H
    	  Q2: INT  21H
    		  CMP AL,48
    		  JE  Q1
    		  CMP AL,49
    		  JE  Q1
    		  JMP Q2
    	  Q1: AND  AL,00000001b
    		  MOV byte ptr [BX],AL
    		  INC BX
    		  LOOP Q2
    		  RET
    	  LEC ENDP
    	  ECR PROC near
    		  MOV DX,offset M4
    		  MOV AH,09H
    		  INT 21H
    		  MOV CX,0
    	  S1: MOV byte ptr AL,[BX]
    		  XOR AL,00110000b
    		  MOV DL,AL
    		  MOV AH,02H
    		  INT 21H
    		  INC BX
    		  INC CX
    		  CMP CX,8
    		  JNE S1
    		  RET
    	  ECR ENDP
     
     
     
    affichage  proc  near 
     
               mov Dx , offset mes  
               mov  ah , 09h 
               int  21h          
               mov  di,offset tab  ;cette procedur afficher
               mov  ah , 09h       ;le resultat d'addition 
               int  21h
             ret
     
    affichage   endp
     
     
     
    debut:       mov  ax , DATA
               mov  DS , ax
               call lecture
               mov ah,00h                   ;met AH a zero***/
               mov cx,08 
            mov  di ,offset tab1           ;adresse debut tableau tab1 =DI***/
            mov  bx ,offset tab2          ;adresse debut tableau tab2=bx***/
               mov si ,offset tab           ;adresse debut tableau tab =si***/
    etq:       mov al,[di]                   ;met le contennu de di dans al***/
               cmp  byte ptr[bx],al    ;comparer le contennu de al avec le contennu de bx***/
               jne   etq1             ;fait un saut vers etq1***/
               cmp byte ptr[bx],01h  ;byte pTR[BX]=al& &comparer le contennu de BX avec 01h****/
               jne  etq2            ;byte ptr [BX]!=01h&& fait un saut vers etq2***/
               cmp ah,01h          ;comparer le contennu de ah avec 01h****/
               jne etq3           ;ah!=01&&fait un saut vers etq3***/
               mov byte ptr[si],01h     ;met le contennu de si a 01h***/
               mov ah,01h
               inc si                  ;passe au suivant***/
               inc bx                 ;passe au suivant***/
               inc di               ;passe au suivant***/
               jmp etq              ;fait un saut vers etq***/
     
    etq3:    mov byte ptr[si],00h        ;met le contennu de si a 00h*****/
               mov ah,10h                ;met ah a 00h***/
               inc bx                    ;passe au suivant***/
               inc si                   ;passe au suivant****/
               inc di                 ;passe au suivant****/
               jmp etq                ;fait un saut vers etq***/
     etq4:    mov byte ptr[si],00h            ;met le contennu de si 00h***/
              mov ah,00h
              inc di                         ;passe au suivant***/
              inc bx                        ;passe au suivant****/
              inc si                       ;passe au suivant****/
              jmp etq                    ;fait un saut vers etq***/
     
     etq2:    cmp ah,01h
              jne etq4
              mov  byte ptr[si],1
              mov  ah,00h
              inc bx
              inc di
              inc si
              jmp etq          
     
    etq1:     cmp ah,01h                          ;comparer ah avec 01h***/
               jne  etq5                          ;ah!=01h && fait un saut vers etq5***/
               mov byte ptr[si],00h              ;ah=01h && met le contennu de si a 00h***/
               mov ah,01h                       ;met ah a01h***/
     etq5:     mov byte ptr[si],01h            ;met si a 01h***/
               mov ah ,00h
               inc di                         ;passe au suivant***/
               inc bx                        ;passe au suivant***/
               inc si                       ;passe au suivant***/
               jmp etq                     ;fait un saut vers etq ****/
     
               loop  etq
     
                                          ;appel la procedure cf&of****/
               call affichage                        ;appel laprocedure affichage***/
                mov dx,offset tab                   ;procedure parmet d'afficher le contennu de tab****/
                 mov ah,09h
                 int 21h
     
               mov ah,4ch                               ;retour au DOS***/ 
    FIN:       int 21h
     
     
    code         ends 
     
              END debut

Discussions similaires

  1. [NASM] Addition et affichage des nombres en hexadécimal
    Par arthson dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 18/02/2014, 14h55
  2. Nombre d'affichage des topics
    Par kivan666 dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 3
    Dernier message: 03/08/2006, 17h30
  3. Réponses: 14
    Dernier message: 07/06/2006, 09h28
  4. Affichage des nombres réels!
    Par smail21 dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/11/2005, 17h49
  5. Formatage des nombres à l'affichage
    Par nbutin dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 13/07/2004, 10h54

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