Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

Embed Size (px)

Citation preview

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Microprocesseur 8086 - TD 4

    TD 4 :Programmation en assembleur 8086Exercice 1 :

    Ecrire un programme, en langage assembleur 8086, qui permet de compter les nombres nuls

    dans un tableau doctets mmoire de longueur 100h et dbutant ladresse [200h], le rsultat

    sera plac ladresse [400h].

    Solution :

    Exploitation des registres :

    Le compteur C sera remplac par le registre CX, et comme tout le tableau de N octets sera

    examin, donc CX va prendre N valeurs, la toute dernire est toujours gale 1, donc la

    valeur initiale sera N :

    CX = N, N-1, N-2, ... 2, 1.Lorsque CX est initialis N, La valeur actuelle du tableau mmoire, qui est dfinie parDS:[SI], est initialise par DS:[100h] ; chaque dcrmentation de CX correspond une

    incrmentation de SI.

    Dbut

    NZ

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Aprs la dcrmentation de CX, on na pas besoin deffectuer une comparaison entre CX et 0,

    parce que la dcrmentation est suffisante pour affecter le flag Z dont on a besoin pour

    effectuer linstruction de saut qui vient juste aprs la dcrmentation de CX.

    Donc les instructions de saut sont gnralement utilises aprs une comparaison ou aprs une

    dcrmentation du compteur.

    Dbut

    BX

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Le programme en langage assembleur 8086 : (partie la plus significative)

    MOV CX, 100hMOV BX, 0000hMOV SI, 200h

    Etq2 : CMP [SI], 0JNZ Etq1INC BX

    Etq1 : INC SIDEC CXJNZ Etq2MOV [400], BXBRK

    Contrairement linstruction HLT qui fait arrter le 8086 de toute activit jusqu larrive

    dune interruption matrielle, linstruction BRK (break) fait arrter le programme en cours

    dexcution et revenir lexcution du systme dexploitation.

    3

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Exercice 2 :

    Ecrire un programme qui permet de dterminer le maximum dans un tableau doctets

    mmoire de longueur 100h et dbutant ladresse [200h], le rsultat sera plac ladresse

    [400h].

    Solution :

    Dbut

    CX

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Le compteur CX a t initialis : N-1 = 100h - 1 = FFh ; En fait le registre AL prend la

    premire valeur du tableau, c d [200h] ; Puis il est compar avec les N-1 valeurs suivantes.

    Pour chaque comparaison, CX prend une valeur, pour la comparaison de la dernire valeur du

    tableau, la valeur de CX et gale 1, donc la valeur initiale de CX est N-1 :

    CX = N-1, N-2, ... 2, 1.

    Le programme en langage assembleur 8086 : (partie la plus significative)

    MOV CX, FFhMOV SI, 200hMOV AL, [SI]

    Etq2 : INC SICMP AL, [SI]JLE Etq1MOV AL, [SI]

    Etq1 : DEC CXJNZ Etq2

    MOV [400], ALBRK

    5

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Exercice 3 :

    Ecrire un programme qui permet de trier par ordre croissant un tableau de longueur N = 100h

    dbutant ladresse [200h].

    Solution :

    Dbut

    BX

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Dans cette solution on a eu besoin de deux compteurs CX et DX ; En fait, pour chaque valeur

    du compteur CX on prend une des (N - 1) premires valeurs du tableau et on la compare avec

    toutes les valeurs qui viennent aprs (avec une pour chaque valeur de DX). Le compteur CX

    prend donc les valeurs suivantes :

    CX = N-1, N-2, ... 2, 1.

    Lorsque CX est fix une valeur (i), on est alors entrain de comparer la valeur (N - i) dutableau avec les (i) valeurs qui viennent aprs ; Donc pour chaque valeur de CX, DX prendra

    les valeurs suivantes :

    DX = CX-1, CX-2, ... 2, 1.

    7

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Une deuxime solution :

    Dbut

    CX

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Dans cette solution on fait le tri de chaque deux valeurs successives du tableau (si elles ne

    sont pas tries entre elles dans lordre croissant, on fait une permutation entre elles) ;

    Pour chaque valeur du compteur secondaire DX, les valeurs trier sont pointes par [SI] et

    [SI+1] ;

    Le tableau ayant N valeurs, et le premier passage se faisant jusqu comparer entre lavant

    dernire et la dernire valeur, le compteur principal CX aura donc parcourir (N - 1) valeurs,

    c d :CX = N-1, N-2, ... 2, 1

    Cette solution permet darrter le processus lorsquon constate que le tableau et dj tri aprs

    un passage du compteur secondaire DX par toutes ses valeurs concernes, mme avant

    datteindre la limite du compteur principal (CX = 1) ;

    Pour chaque passage (i) (c d pour chaque valeur du compteur principal CX = N - i), SI varie

    de sa valeur initiale (200h) jusqu la valeur (200h + N - i -1), ce qui donne (N - i) valeurs,

    donc le compteur DX va prendre les (N - i) valeurs suivantes :

    DX = N-i, N-i-1, N-i-2, ... 2, 1

    Ce qui donne :DX = CX, CX-1, CX-2, ... 2, 1

    Par exemple, pour un tableau de longueur N = 5, et pour le premier passage et le deuxime

    passage (i = 1) on aura :

    CX = 3

    DX = 3 2 1

    (SI+1) finale

    CX = 4

    DX = 4 3 2 1

    (SI+1) finale

    9

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Le programme en langage assembleur 8086 :

    ;tri3CODE

    START :

    BEGIN :

    Etq3 :

    Etq2 :

    Etq1 :

    Fin :

    CODE

    SEGMENTASSUME CS:CODE, DS:CODE ES:CODEORG 0100H

    N EQU 100HJMP BEGIN

    ; la procdure sera place ici

    MOV AX, CODEMOV DS, AXMOV ES, AX

    MOV CX, N-1

    MOV SI, 200hMOV DX, CXMOV BL, 0

    MOV AL, [SI]

    CMP AL, [SI+1]JLE Etq1XCHG AL, [SI+1]MOV [SI], ALINC BL

    INC SIDEC DXJNZ Etq2CMP BL, 0JZ FinDEC CXJNZ Etq3

    BRK

    ENDSEND START

    10

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Une troisime solution : (utilisation dun sous-programme appel FINDMAX)

    Dbut

    CX

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Le sous-programme :

    XCHG AL,[SI+1][SI]

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Le programme en langage assembleur 8086 :

    programme sous-programme

    ;tri3CODE

    START :

    BEGIN :

    Etq3 :

    Fin :

    CODE

    SEGMENT

    ASSUME CS:CODE, DS:CODE ES:CODEORG 0100HN EQU 100H

    JMP BEGIN

    ; la procdure sera place ici

    MOV AX, CODEMOV DS, AXMOV ES, AX

    MOV CX, N-1CALL FINDMAX

    CMP BL, 0JZ FinDEC CXLOOP Etq3

    BRK

    ENDSEND START

    FINDMAX

    Etq2:

    Etq1 :

    FINDMAX

    PROCPUSH CX

    MOV SI, 200hMOV DX, CXMOV BL, 0MOV AL, [SI]CMP AL, [SI+1]JLE Etq1XCHG AL, [SI+1]MOV [SI], ALINC BLINC SIDEC DXJNZ Etq2

    POP CXRETENDP

    Remarques :

    Le compteur CX est utilis par le programme principal, mais il nest pas ncessaire de lempiler avantlexcution de la procdure du sous-programme, car cette dernire ne modifie pas le contenu de CX.

    Il est possible aussi de faire lempilement de CX dans le programme principal juste avant le CALL et de faire

    son dsempilement dans le programme principal aussi juste aprs le CALL.

    Le registre BL ne peut pas tre empil et dsempil par le programme principal, car la valeur retourne par le

    sous-programme ne doit pas tre perdue avant son utilisation dans linstruction (CMP BL, 0) qui vient aprs le

    sous programme.

    On rappelle que pour un programme dont lensemble des segments ne dpasse pas les 64 Ko,

    alors, le programme est organis selon le canevas suivant :

    ; nom du programme

    CODE

    START :

    BEGIN :

    CODE

    SEGMENTASSUME CS:CODE, DS:CODE ES:CODE, SS:CODEORG 0100H

    placer toutes les EQU ici

    JMP BEGIN

    placer tous les define iciplacer toutes les procdures ici

    placer votre programme ici

    ENDSEND START

    13

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Exercice 4 :

    Ecrire un programme qui puisse calculer le PGDC (plus grand diviseur commun) de deux

    nombres se trouvant aux adresses [200h] et [201h] ; le rsultat sera plac ladresse [202h].

    On rappelle que :

    * PGDC [n , m] = PGDC [m , reste(n/m)] , n > m

    * PGDC [n , 0] = n , quelque soit n

    Solution :

    Cette solution utilise une procdure rcursive (qui fait appel elle-mme) :

    programme sous-programme

    ;pgdcomCODE

    START :

    BEGIN :

    CODE

    SEGMENTASSUME CS:CODE, DS:CODE ES:CODEORG 0100HJMP BEGIN

    ; la procdure sera place ici

    MOV AL, [200]MOV BL, [201]CBW ; forcer AH = 0CALL PGDCMOV [202], ALBRK

    ENDSEND START

    PGDC

    FIN :

    PGDC

    PROC

    PUSH AXPUXH BX

    DIV BL

    CMP AH, 00HJZ FINMOV AL, BLMOV BL, AHCBWCALL PGDC

    POP BXPOP AXRET

    ENDP

    Remarque :

    Les registres AH, AL, BH, BL sont employs par le programme principal et par la procdure, donc on doit les

    empiler avant de les utiliser par la procdure, puis les dsempiler aprs finir leur utilisation avec la procdure

    (PUSH et POP ne fonctionnent que sur des registres 16 bits).

    14

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Exercice 5 :

    Ecrire un programme qui puisse calculer un dixime prs la moyenne arithmtique de

    N = 100 valeurs se trouvant dans un tableau.

    Solution :

    ;moyCODE

    START :

    BEGIN :

    Boucle :

    Fin :

    CODE

    SEGMENT

    ASSUME CS:CODE, DS:CODE ES:CODEORG 0100H

    N EQU 100DJMP BEGIN

    MOV AX, CODEMOV DS, AXMOV ES, AX

    MOV SI, 200MOV CL, NMOV BX, NMOV AX, 0000H

    ADD AX, [SI]INC SILOOP BoucleCWD ; Forcer DX = 0DIV BXXCHG AX, BXMOV [0400H], 0AH ; 0A Hexa = 10 DciMUL [0100H]DIV BL

    BRK

    ENDS

    END START

    15

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    Exercice 6 :

    Ecrire un programme qui indique la prsence de la chane de caractres TEC568 qui dbute

    ladresse [300h], dans un tableau de N = 96 lments qui dbute ladresse [200h], (utiliser

    deux procdures AFICH_OK et AFFICH_NK pour afficher le rsultat).

    Solution :

    Dbut

    SI

  • 5/21/2018 Programmation en Assembleur 8086 PDF February 10 2009-5-39 Pm 170k

    http:///reader/full/programmation-en-assembleur-8086-pdf-february-10-2009-5-39-pm-

    La longueur de la chane TEC586 est N= 6, la premire lettre T est donc cherche parmi

    les (N - N-1) premires valeurs ; et le compteur CX prend les valeurs suivantes (sa dernirevaleur est toujours gales 1) :

    CX = N-(N-1), N-(N-1)-1, ... 2, 1

    Par exemple, si N = 15, on aura :

    Le programme :

    ;moyCODE

    START :

    BEGIN :

    Etq1 :

    Etq2 :

    Etq3

    Etq4

    Fin :

    CODE

    SEGMENTASSUME CS:CODE, DS:CODE ES:CODEORG 0100H

    N EQU 96DJMP BEGIN

    MOV AX, CODEMOV DS, AXMOV ES, AX

    MOV SI, 0200HMOV CX, N-5MOV DI, 0300HMOV BL, 6CLDCMPSB

    JNZ Etq3DEC BLJNZ Etq2CALL AFFICH_OKJMP FINCMP BL, 5JZ Etq4DEC SILOOP Etq1CALL AFFICH_NK

    INT 3

    ENDSEND START

    Rev 1.06 (25 - 01 - 2009) - http://www.electro.bbactif.com/- Code is Poetry

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

    T E C 5 8 6

    CX = 10 9 8 7 6 5 4 3 2 1

    17