Vous êtes sur la page 1sur 155

| 

  

  
    

       
|     
  
      


 
  

|àà|   
   

à 
!"
 ##$
TITLE %
&'(SEGMENT STACK % "  
%  
))))))))))
))))))))))
&'(ENDS %*   
à

((SEGMENT % "    


%     
)))))))))))
à

((ENDS %*  


( à(SEGMENT %     
%
à
% "    "
)))))))))))))))))))))))))))))))))
( à(ENDS %*  
END à%*  "

à 
( 
TITLE prog2.asm: Exemple sur ROL,
Pile segment stack ;
dw 100 dup(?)
Pile ends

DATA segment
DATA1DW 5F97H
COMPTE DB ?
DATA ends

CODE segment
MAIN:
ASSUME CS:CODE, DS:DATA
MOV AX,DATA
MOV DS, AX
XOR BL, BL ; Mettre BL à 0 (ou bien SUB)
MOV DL, 16 ; rotation 16 fois
MOV AX, DATA1
ENCORE: ROL AX, 1 ; Rotation a gauche (a droite aussi si on préfère)
JNC PROCHAIN ; Test si CF=0
INC BL ; Si CF = 1, incrémenter le compteur du nombre de µ1¶
PROCHAIN: DEC DL ; répéter 16 fois
JNZ ENCORE ; encore une fois si ce n¶est pas fini
MOV COMPTE, BL ; sauvegarder le résultat dans la case mémoire COMPTE

MOV AH, 4Ch


INT 21h
MAIN ENDS
END MAIN
à  +
&    ,
-.  
 &    $+/  
     $ 

(  .


 &   0    
1

( 
  2   
   
3   )))

à  4
! 
|        
  $  
     
&   
 à  +  .  

 | |

 | 
|5$6
(     
 
7(( 8.  6 7((
7((
 à+     8.
 ** 
à  $
! 

   +  .  


!à!!!(!
          
     
   
..** 
| 
Y  Y 
 ( 
 !
'&
     8 
 à!
!'
 .
 !!
!&
  

à  7
      
    "  

.asm AS M

à  #
à   
      :  

 ,%  ;    


 <<%  ;    8<< 44  
 =,%  =$  
 +4,% + 4;     
 4=4% 4 ;     84
à :

DB
;#  DB;
DW
=$  DW
DD
 =    DD
DF,DP
$;
DQ
#; $+  
DT
;
    2  

  
r   r 
   
r   r  
   
 **  
   
r  rr rrrrr

à  9
  !   
 &      **    ; :
"     à !*  *      

 |** ":
 à>|?%:|  * à
 |@ %* )
 %à !

 |** " :



 à **  %   "  
::  
 |@9%* )9
 %
 ! ":
 |@%* )
   %    |

à  
 Saisie d¶un caractère mov AH, 7; fonction no. 7
(sans écho) int 21h ; résultat dans AL

 Arrêt de programme
 | +%
 %
-8* * %" " 
)     **à !

à  
"      
 

 * | 


'*  *
3&| 
 %
( 
 A
 %B
3  
 %3& *
C( 
3  
3  
 *
))))))))))))))

à  
'  

<| |'
D
'     ,
Si    alors
'   
Sinon
'   '    '   
Fin si
'   E

'   E

à  
 < | 
 <E%EF%E663  
   6E%3  
<
3& 
|(*
|àà 
'

3&<
(*


à  +
 @'(| 
  43  4
 =  G= 
3& 
  %((= 
à( 
3&= 
(= 


à  4
 !'B@| 
 = A3&
 
))))%E%
(  
 
)))))%E%))))))))))))
*
)))))%3& = 
C 
3& 

(*
))))))))))
3& = 
*
)))))))))))
 = 
)))))))))))

à  $
ócrire le code de l¶instruction En assembleur
*GHHF *

A  *
))))))))))))))))
C
 *
))))))))))))))
 *

Exercice:         

) *GIIG )* % F% 66


AA

CC

à  7
        
A. Registres généraux
 AX (A pour accumulateur): 1"    
   
3à' '
.
 CX (C pour compteur):         
 &)
 DX
           
"  )
 SI (Source Index):       
  
3 |J!'K)' :     
     :  à!)
 DI (Destination Index):  !'   !B !
 BP   
     
" "   

3 | J &6 K)
 SP (Stack pointer):     % 
       &!@& &)

à  #
B. Registres spéciaux
 IP (Instruction pointeur
 " "      
   "  )
 DS (Data Segment)
&      

 CS (Code Segment): &     
)
 ES (Extended Segment) :    
 *  )' 
"   | à!)
 SS (Stack Segment):  )

C. Registre indicateur
         
  *8 :    )
L       *   

< <)

à  9
à  
< "   
Label: Mnémonique Opérandes ;commentaire

Label:    *    


        )!  
    * *8" 
  )! "  * *8" 
   )
      
)' 
           
   )
      
8* ) ' 
  8  * )

à  
 Mnémonique      
  8
 *    )L 
        
   )
 Opérandes:     
  8  )
2" 
    
"    )
 Commentaire:   %)'
88   *      
 * 
"    )

à 
L      
 Affectations
%  F 
3 AX$44 4 % 
3 Cl %  
3 DH<| % 
%( 
3 AXBX
3 CLDH
%(    
3 CX  MM M
3 variable_de_un_octetà
%  F |  3 
3 AX **    %| F    
3 CXJ4|K % F 8. 4| 

à 
L      
 Arithmétique
%' 
'
AX %| F | 6
'ma_variable
%à 
à(AX
àma_variable
%|  
|ààAX4 %| F | 64
|ààBH % @F @6
|toto  %F 6
%!  
! AX4 %| F | N 4
! BH % @F @N 
! toto  %F  

à  +
L      
 Logique
%|
à 8 
3 AH %|@F 4
3 BH % @F 9
|
àAH @ %|@F |@|
à @%|@   
%  8 
3 AH %|@F 4
3 BH % @F 9
AH @ %|@F |@  @%|@    #6+6
%  8 
3 AH %|@F 4
3 BH % @F 9
Ah @ %|@F |@  @%|@    #6+
%
B 8 
3 AH %|@F 4
AH %|@F
B|@%|@ 
 #6 

à  4
L      +
 Comparaisons :
B     *8. .   CMP)
            

Jump if Equal
JMP if Greater)))
'**      
    O 
     *  P B <)
%(  *(
3&AX4
(M
%à ** *
(
3&AXM  

(M 
%'* ! '*)!)
% *=P=(P(
3&CH
M
3&DH|
PM
3&AL
(M
à  $
3&variable$4
P(M+
M
    )))
M
    )))
M
    )))
M+
    )))
%!  

3&M

Remarque: CMP    8"   SUB   


 )'   * )' 8 
 8 $  )   8    8
 127octets)'* 2
 )

à  7
à  #
 ! 0) 

( ! ) < 
(
 !  * ) 

 !  * ) 


|( !     ) < |(
! !   *) !< 
!
 ! ) < 

&( !   )
& !  ) &< &

 !  0) 

( !  **) < (

 !  ) 

!   * ) 
|( !   ) < 
|(

! !    *) !< !

!  ) < 
& !    ) &(
à  9

& !   ) &< &
3 " 
.  ; 
  .  : 8)
2
   
    8  
    
 )
       
.    
.   * 
     )
à  
3 " 
 Mode immédiat
"  "   
 | 4$#
 Mode registre
"  " 
 | 
 Mode mémoire direct
"  "  "   
 J+K|
 à!
J+K|
 !
 |
mais pas
 <(4
 | 

à  
3 " 
 
 Mode mémoire indirect
"     
  "   "   
 | J!'K  &!'à'    
 
)Indirect avec déplacement
"  " 6
le registre d¶adresse n¶est pas modifié
 | Jà'K
 Jà'6$K

à 
3 " 
 
)Indirect avec index
"  " 
6 "  le registre
d¶adresse n¶est pas modifié
 J &KJà'K|
      &à'
&!' à' !'

à 
L   
  ":   
.. .. . .)
 :.Q.  * ": )
!       
:   **  
 : )
 " *   **
     "   
       )
   |!!3(.  8. 
O     
)&   . .      8
"   

3 | MM MM
3 à!|

à  +
  "   
 *
3  8 
 8 
 8 
  8 
  8 

B(
&  * 8 

à  4
|    
      

à  $
'  3&  3&     Compar C ZF
e F
Opérand
L¶instruction CMP affecte les indicateurs AF, OF, SF, PF, CF et ZF
mais seuls CF et ZF sont utilisés.
es
Dest. > 0 0
L¶opérande destination peut être dans un registre ou dans une mémoire.
Src.
L¶opérande source peut être dans un registre, dans une mémoire, ou en mode immédiat.
Les opérandes (destination et source) ne changent pas. Dest. = 0 1
Src.
DATA1 DW 235FH
« Dest. < 1 0
MOV BX, 7888H ; 7888Hh ð BX Src.
MOV CX, 9FFFH
CMP BX, CX ; BX < CX ð CF=1 ð JNC est exécutée ð PASSE
JNC PASSE ; 2 : les contenus de (BX, et CX) ne changent pas après CMP
ADD BX, 4000H
PASSE: ADD CX, DATA1 ; mais CF est toujours vérifié pour (< ou >). Pour (=) on utilise ZF.

TEMP DB ?
«
MOV AL, TEMP ; TEMP ð AL
CMP AL, 99 ; TEMP = 99?. Avec (SUB AL, 99), la même chose mais 0 ð AL
JZ PROCHAIN ; Si ZF=1 (TEMP=99), Saute a PROCHAIN:
INC BX ; Sinon incrémente BX
PROCHAIN: HLT ; Arrêt du programme

à  7
TITLE prog1.asm: Exemple sur CMP, Trouver l¶octet le plus grand parmi 5 notes d¶élèves
PILE segment stack
dw 100 dup(?)
PILE ends
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
DATA segment
NOTES DB 18, 06, 19, 11, 08
PLUS_G DB ?
DATA ends
;------------------------------------------------------------------------------------------------------------------------------------------------------------
CODE segment
main:
assume CS:CODE, DS:data ; génération de l¶adresse du segment de code et de données
MOV AX, DATA ; Initialiser le registre DS pour récupérer l¶adresse du segment de donnée
MOV DS, AX
MOV CX, 5 ; compteur de boucle
MOV BX, OFFSET NOTES ; BX pointe vers les données NOTES
XOR AL, AL ; Initialise AL à 0; va héberger la plus grande note
ENCORE: CMP AL, [BX] ; compare la note prochaine a la note la plus élevée
JA PROCHAIN ; Sauter si AL est encore la note la plus élevée
MOV AL, [BX] ; sinon AL retient la plus élevée
PROCHAIN: INC BX ; pointe vers la prochaine note
LOOP ENCORE ; CX décrémente jusqu¶à 0 pour sortir de la LOOP
MOV PLUS_G, AL ; sauvegarde de la note la plus élevée dans PLUS_G
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
MOV AH, 4Ch
INT 21h
MAIN ENDS
END MAIN

à  #
TITLE prog2.asm: Exemple sur ROL, Trouver le nombre de µ1¶ dans un mot
Pile segment stack ; déclaration d¶un segment de pile ± pas nécessaire dans notre cas
dw 100 dup(?)
Pile ends
;------------------------------------------------------------------------------------------------------------------------------------------------------------
DATA segment
DATA1DW 5F97H
COMPTE DB ?
DATA ends
;-------------------------------------------------------------------------------------------------------------------------------------------------------------
CODE segment
MAIN:
ASSUME CS:CODE, DS:DATA
MOV AX,DATA
MOV DS, AX
XOR BL, BL ; Mettre BL à 0 (ou bien SUB)
MOV DL, 16 ; rotation 16 fois
MOV AX, DATA1
ENCORE: ROL AX, 1 ; Rotation a gauche (a droite aussi si on préfère)
JNC PROCHAIN ; Test si CF=0
INC BL ; Si CF = 1, incrémenter le compteur du nombre de µ1¶
PROCHAIN: DEC DL ; répéter 16 fois
JNZ ENCORE ; encore une fois si ce n¶est pas fini
MOV COMPTE, BL ; sauvegarder le résultat dans la case mémoire COMPTE
;------------------------------------------------------------------------------------------------------------------------------------------------------------
MOV AH, 4Ch
INT 21h
MAIN ENDS
END MAIN

à  9
L     
L¶itération:   8" 
"    & "        )
3   


DD% 
 & 
  *     
 "  )|    "
 )
Attention:       
 $44 4  
 8   

à  +
* 4% G% 
  6

3 | 
3  4%  
*

|àà|  %* 


 &*%"  )
%  G*  8*

à  +
    &( & &
( &

  * 


) &(     R3


à    FG < *  
8 )
3  
 &

) &
(     R3
à    FG < *  8
  )

à  +
**à #à&
DD))



3 |@%
'
B 
3 J K|%"  
'

3&|à% ,
 &
( %    "8 ,,,,

à  +
 Décalage et rotation
!@! **%!@
  * 
**8   )!  :
      )   *
  <%       * )
SHL AL, 1
*  8    1

MOV CL, 4
SHL AX,CX
&      !|    8)

à  ++
Manipulation de données
1. Operateur offset
  " 8  
Exemple: DD
 ,
  =,
   ,
DD
!    8" ** ++ "**    
   

3 | **  %| ++


3 | **  %| ++
3 | **   %| ++

2. Operateur PTR: &  


)& 
D
 +4$7#
D
3 | %
3    :   à&B   * 4$7#
 | %" 8 
3 |  à&B 

à  +4
Un mot sur les macros

S       :


  " 
*  Y ;
     )
'        
"       )
 "  
     
"  )   *
 R)

à  +$
  8 **  "
 *   )!" 
  *  )(  " * 
 8    *  
) " 
"   
)'Y YY     Y Y

 Y       


|     0 0*   


   0* 
)"  **  *  
    " *   2
    " 8" "|
"    )

à  +7
   


"    8  8


")

à  +#
**  
%  à 
%    
  %     
  **  
 9
 
 %  
%* 

à  +9
 "   
        :
 :  
   
 * :)
 !  8 "   8
"  Ä Ä   Y YY R
  8 8" 
 
 La syntaxe suivante

   Ä Ä   Y YY  r r 
   " 66

à  4
&  "  

à  4
B'B( M %  
&'(!(P3(
B!B|/%  )
%&  "    )

àà&,
&'((
à!
**  %** 
%: 
3 à **  %**   "  
3 |@9%*  ** : 
'
B 
(
à3%* 

à|B|!(P3(
B%   

 
M  .  0 . .Q.% 
66
M   .  0  . .QT
**M  .    
. .Q.%Q:*  
à|B| (
à!

à  4
! à(!(P3(
B%0
|!!3(!
! à(à!
à|B|% "  

à( B
 %
3 | à|B|%'    à!" 
3 à!| % 

%8 "     

** M %**  


 M 
3 |@%*  U8* :
  |
'
B 
3  |
** M  %**   
3 |@%*  
'
B 
|àà| %||6 
3   |

à  4
** **M %**   
!    %    1   % 

%     
%:   
%    :  )
%à 6 $ )$ "    
%: )!  
%     +#
% )
3 |@ %**    U8*  
'
B % ** à
3 à 
3 |@+%  * 
3 |%+ )  G 
'
B %"   " )
%S 
! à((
à!%*  
(
àà( B

à  4+
B'B( +M % **    
%   8   
&'(!(P3(
B!B|/
àà&,% " 
&'((
à!
**   %8  "  " 
%    
  **   %    
 9 %** : 8 
%"  
 
(
à|B|!(P3(
B
 %     8

 
M  .  0 . .Q. % 
66
M   .  0  . .Q.
**M  .  
. .Q.%Q:* 
à|B|(
à!
à  44
! à(!(P3(
B
|!!3(!
! à(à!
à|B|%      

à( B
 %
%'    à!"  
%  |!!3(
3 | à|B|
3 à!|

** M  %"**   M 


3  |
3 |@%*  ":
'
B 
** M  %**  
3 |@%*  
 
3   |
3&| 
P

à  4$
3 à 
3&  

3 à 
 
3 à
** **M %**  
3 à%        8
%**  
3 |@
'
B 
%B   à !
3 |@+
3 |
'
B 
! à((
à!%*  
(
àà( B %* "
à  47
Exemple 5: que fait cette portion de code?

3  ** | %: 


3  $
3 J K% $: 
3 |$4 %$4.|. |
3 
'
 
3 J K|%  
'
|%|:  
à(%**"  <

3  % "  <
  % 8
3  ** 
3  $

'
 
3 àJ K
3 |@ 
'
B 
3 àTT%"** 
3 |@ 
'
B 
à(

 

à  4#
Exemple 6
*     ,

3  **  %3T  


  
3 à'%' 
3 | 
3  %  
3 
3 J 6à'K| %  
!@| %| | 5 
|ààà' %   G 
 
à( 

3 

Remarque 1
   ":  
        
 
   : ** *: )
Remarque 2 :    !'à'  2    
     **)

à  49
B'B(   %*    
      )
6 6
&'( !(P3(
B!B|/
àà&,
&'( (
à!
**  % 
  **  
 9
 
%* 
à|B| !(P3(
B

 

**M  .       
. .Q.%Q
:* 
à|B| (
à!

à  $
! à( !(P3(
B
|!!3(!
! à(à!
à|B|
à( B
%'    à!
3 | à|B|
3 à!|
3 | 


3&|@ 
P( 
'
|@
|àà||@
3& 
 
|àà| 
3 |
** **M %** 8" 
3 |
3 à|
3 |@ %**    
'
B 
%B 
3 |@+
3 |
'
B 
! à( (
à!
(
àà( B

à  $
 ( 7
(   B 
T" 

à  $
B'B() 
(   B T" 
&'(!(P3(
B!B|/
àà&,
&'((
à!
à|B| !(P3(
B
à|B| àà | à4<97@
 3&B( à ,
à|B|(
à!
 à(!(P3(
B
|!!3(!
! à(à!
à|B|%'    à!
3 | à|B|
3 à!|
   %3 8 ! 
3 à  %$ à@à%  
3 |  à&Bà|B| %    
3  à&Bà|B|6 %    :
(
 (
  |  % 88   *:
 & @|'
 B  <
'
  %! < T"
& @|'

à(à %$*

(
 ( %*  "  *  
3 | %    | | 
%    "   
(
 (
   % 8
& @|'
 %B  <
'
@ %! < T"
& @|'

à(à@ %$*

(
 ( %*  "  * 
3 |@@ %    |@)32"
|àà |@| %|    T"      
3  3&B(|@ %     3&B(
3 |@+ %à !
'
B 
(
à!
à  $
(
à 3|'

  3  


3  
L Hex Binaire L Hex Binaire

A 41 01000001 a 61 01100001

B 42 01000010 b 62 01100010

. «««« . ««««

. «««« . ««««

Y 59 01011001 y 79 01111001

Z 5A 01011010 z 7A 01111010

à  $+
B'B(#) %  3'
!(ð 3|!(" 
&'( !(P3(
B!B|/
àà&,
&'((
à!
à|B|!(P3(
B
B( B( à T 
!B(  (" TQ"
B( B(  à à&,
%
 à(!(P3(
B
|!!3(!
! à(à!
à|B|
%'    à!
3 | à|B|3 à!| 3|'

3 !' <<!(BB( B( %!'     


3  <<!(BB( B( %    3|!(
3     %
|'((
3  |;J!'K % :
3& |$@ %! FT" $@ |!''T"
 &|!!( %     
3& |7|@ %! GT0" 7|@ |!''T0"
| &|!!( %     
|
à | %  4  3|!(
&|!!(
3  J K| %  :3|!(
'
 !' % >      ?
'
 % >    3|!(?
 & |'(( % 8 G
%
3 | +
'
B 
 à( (
à!
(
à 3|'

à  $4
( 9
 : 
"** 8"  

 & 

à  $$
  
   E
=,
 
 
  44.Q.
 .QT%66


 
 




  
  
% 8 8
  **  
 %8  ":
%   : " 
 
  
  

à  $7
à
 %8   *   :
*  
!'
  ;J K

*  

!'

 à ** 
 |@9
 
*

!'
* M
 à;J K
 |@ 
 
!'
*
* M

  +
 

à

à  $#
 :* 
 %

  
  àJ 6K% : 
 % 8 "    
 %J 6K"    *   
 %    
 %  à #  % à  $ 
 %     8
   
 
   
 *M

  
 * M
   J K
   
  
 
 *M
 * M

   +
  

 
 
à  $9
Une troisième manière de le faire

 

 à à
  à  J K% : 
 % 8 "    
 %  à #   à  $ 
 %     8
  !'à
 !'
   
 *

 !'
 * 
  à J K
  |@ 
  
 !'
 *
 * 

  | +
  

 
 

à  7
 MULTIPLICATION ET DIVISION SIGNóE (IMUL / IDIV) reg.
(ou mém.)
 2
à   "''3'à' '3   
à'       *   " 
3   à     )
DIVISION SIGNEE NUM. (> ou <) DENOM. (> ou <) QUOTIENT RESTE

Octet/Octet |   )) | |@

Mot/Mot | 3à )) | à

Mot/Octet | 3 )) |( N #G|G6 7 |@

DoubleMot/Mot à | à3 )) | ( N 7$#G| G6 7$7 à

MULTIPLICATION OPERANDE 1 OPERANDE 2 RESULTAT


SIGNEE (> ou <) (> ou <)
Octet/Octet | )) | < < |@ :  
    "  ð    |@
          |@
&*< <"  
Mot/Mot | )) à | < < à  : 
     "  ð    
à           
à &*< <"  
Mot/Octet |   )) à | 2

DoubleMot/Mot

à  7
Title exemple pour trouver la moyenne d¶un ensemble de nombres
PILE segment stack
dw 100 dup (?)
PILE ends
DATA segment
SIGN_DAT DB +13,-10,+19,+14,-18,-9,+12,-9,+16
MOYENNE DW ?
RESTE DW ?
DATA ends
CODE segment
ASSUME CS:CODE, DS:DATA
MOV AX,DATA
MOV DS,AX

MAIN:
MOV CX,9 ; Charger le compteur
XOR BX,BX ; Mettre a 0 le registre BX, utilisé comme accumulateur
MOV SI,OFFSET SIGN_DAT ; SI ð SIGN_DAT
ARRIERE: MOV AL,[SI] ; Un octet de donnée ð AL
CBW ; Extension du signe ð AX
ADD BX,AX ; BX+AXðBX
INC SI ; SI+1 ð SI
LOOP ARRIERE ; Boucler tant que CX > 0
MOV AL,9 ; Le nombre totales des températures ð AL
CBW ; Extension du signe ð AX
MOV CX,AX ; Sauvegarder le DENOMINATEUR dans CX
MOV AX,BX ; LA somme des températures ð AX

; EXEMPLE D¶UTILISATION DE IDIV ð TROUVER LA TEMPERATURE MOYENNE


 CWD ; Extension du signe ð AX
 IDIV CX ; Trouver la moyenne des températures (AX/CX)
 MOV MOYENNE,AX ; Sauvegarder la moyenne (QUOTIENT)
 MOV REMAINDER,DX ; Sauvegarder le reste
 MOV AH,4CH INT 21H ;Retourner au DOS
 MAIN ENDP
 END MAIN

à  7
(    
|5 6 5à 
)))))))
à 
=,
|=,
=,
=,
à=,
à
|  
3 |  %  
'3| %à
| |5
3  à %
3  | %
| |5
3 | 
'3 %à
|  5
|àà|  %| | 6 V*    ;   
|àà  %à
| |5 6 56 " ;  |à
3  à
!   % à
'à'  %| |5 6 5à 
3  | %  |5 6 5à  E 
(B
|  %* 
))))))))))))

à  7
  " : 
  
B *      
 
: )|     
# 7   " 
: T# 7")
&      ; 
    "   

à  7+
|   
 :


 
  **:
 56 **
 
 ! G8

à  74
( 
 T# 7"
 
  **#
 56 **56##
  **
 56 #56 #
  **7

567# 567# 7


à  7$
(    
B'B(  
!&'(!(P3(
B!B|/
àà&,
!&'((
à!
!à|B|!(P3(
B
  44.Q.
!à|B|(
à!
! à(!(P3(
B
|!!3(!
! à(à!
!à|B|
à( B

 |  
 à!|
 à **  
 |@
 
 !'
 | 
  
  J K
!'


 à 
à
 à J K
à+#%  "  )" :  
 à@
| à
!'

3 | +@
'
B @
! à((
à!
à  77
(
àà( B
&  :  * |    
:   0à!
à ** 
  )*   
 )**    *    

byte contenu
 : 8 

:     )


    * )

-     : 

à  7#
  "  
: 

B * **    


:)|  **  # 7 *  
     **   %    
  **       8
"**  )
|    ** # 7 "  ** #
7       **  
  "   )(     |!''
   *  8"**  
 "     )

"   **  "   2


  

à  79
| 
E

 %
 W%
JEK %
 %
E66
=  V

à  #
Dans ce programme, les chiffres composant le nombre contenu dans AX
est affiché dans le bon ordre

   |  


%

  | %   


  ** %    
 9
 
   
 !'**  %  8  
  ** 
%  8
  
  
 
%    *    $ 
  
|
* M
|@+#
 ;J K|@
 |@
!'
 

à  #
* M

|@+#
 ;J K|@
%    8" 
 
  **    %8 
 
| |
M

!' 
* M
 |@;J K
 ;J K|@


 M
à  #
* M

 ;J K

 ;J K

 ;J K.Q.
  **   
 9
 
3 | +@
'
B @
! à((
à!
(
àà( B
à  #
La directive EQU
  (L1  
   )(
 " 
   )! 2 
"2   
  " )

à  #+
Quelques exemples

  (L  N  


 YY (L> YY Y Ä 

Y ?T"
 Y  (L
   (L
   (L  
  Y  (L 
  r (L  

à  #4
  

à  #$
 Utilité d'une pile
  0   E
    )' . .;.8  
          )
|           E  
 : 8   E        8
  )
(   . .0 .  
  )
  ;'<  '<   . 8  :
   :  !    0      
*        )
       V)

 Les instructions PUSH et POP


     &!@& &         8 
   )
 &!@  Y     
 & &  Y :  E  
 

à  #7
|  .   
Ö 
   

.   

ÖÖ 

:  


 *: | )

à  ##
Utilisation de la pile sur un exemple
 à .   .  
  . E 
   |  
         
* .   
 .   )))

à  #9
 &!@| 
 &!@ 
 3 | J+K
 |àà | 
 3 J+K 
 & & 
 & &| 

à  9
 Les registres SS et SP    !!!&
     8 

 !!     


Y       $  
.   )
 ' 2    

 !& Ö        


   
 $    * )

à  9
 !&    . 8  
  ) .
 8 . 
 !&   
 * $  )
 (** .  
     )
&.   & &  
 $   !&)

à  9
 PUSH
!&F !& 
 POP
!&F !&6 

 |      !& 


      
   .; 
 )& &  
)))
à  9
Déclarer une pile
 &      *
. 8     
            
    8  
    
    
    )
 |  *     . .
U8  !(P3(
B
E)

à  9+
Déclaration d'une pile
&     *  ;
    ** )(      .     
  !!!&     )   
 .  


M !(P3(
B E%* E 
à,%   
 M (L =%   
M (
à!

*XX E..:   !(P3(


B   8
. .  . .  )

|* .    !& *.   %. 1


  M (L =  *   )

à  94
à  9$
 !     * 
.     


 |!!3(!!
M % : " 
% 
 3 |  M 
 3 !!| %      
 3 !& M % .    !&

 0" .   * 


  Y    
  .  V

à  97
  * 
La notion de procédure - fonctions
(     
 .** 
.     )
    
*  .  ) *   
.      
  .   
   
  )à.* 8
2   
*      
     2))))
à  9#
à  99
La déclaration d'une procédure
(.   .      . 
        
 ).       
  )

      


     * *
ÖÄ       
   2 
'   :   
* 2
Ö  * )|  
  8


à  
   & 
  
  
)))
(B

   (
à&

à  
Appel d'une procédure
. .   Ä   ..
)(     . $
     
 
 .  :
ÖÄ)

à  
Comment l'appel et la fin de la procédure fonctionnent?  
. :  
E  '& "    
       .      .8 
'    '&.  ; 
E .ÖÄ)

  : *   


 2   . 8   
  2     
  )(* 8*  
.   Ä   .  
 '&    .     .   |
  * 8..   '   
.      E 
 '&)

à  
à  +
   "     
   

 *   
 8" à !)

  |!'' 
   *  
 )PU8  8 
* "  )

à  4
B  
&   E
=,
   =
& 
 
 " V" TQ"


 
 


 


3 | 
3 à!|
3 | & 
3 !!| %      
3 !&  

3  

   %
 & %  8
%    **

%   à !

 | +
'
B @

à  $
  %* 
 9
  **  
 

  %* * 

 %*  


%* "

à  7
Le passage de paramètres
**      
. * *    .;
 :      
      :  
:       )' *  
*   : 8


Le passage des paramètres par registre


 E    
       

Le passage des paramètres par pile:  E    
  .   
 )

Le passage de paramètres par registres .  


  :
( 8 
* *8         
   .        
"* )))

à  #
Le passage des paramètres par registre
 : :  8  
 :     : 
. 8     )  
*:  :  )

Le passage de paramètres par pile


 :  8 E 
  :    .
U8.   Ö    U
8   Ö
      
         *  
 !&)

à  9
L'appel de la procédure se fera comme suit:

PUSH parametre1 ; où parametre1 correspond à une valeur ou


une adresse
PUSH parametre2 ; où parametre1 correspond à une valeur ou
une adresse
CALL procedure

La procédure commencera par l'instruction suivante:

MOV BP, SP ;permet de faire pointer BP sur le sommet de la


pile

Puis pourra contenir des instructions du type:

MOV AX, [BP] ;Stocke la valeur contenue dans le sommet de


;la pile dans AX, sans dépiler
MOV BX, [BP+2] ;Stocke la valeur contenue dans le mot
suivant de la
;pile dans BX (un mot fait 2 octets), sans
dépiler

à  
Exemple avec passage par
registre
   XX! 33(.. 
    
$  )
         
   |  
    | )

  .  : 




à  
! 33(& %
| F | 6 
|àà|  
(B
! 33((
à&

   $8  B




3 | $
3  B
|! 33(
3 B| 

à  
Exemple avec passage par la pile

     &Y Ö   


            * !&)

  &.     *




3 | J &6$K%    .  &6$


 | )

|      



3  &!& % &   
3 | J &K %       

3 | J &6 K %    )

 .XX! 33( ..    




&!@$
&!@B
|! 33( 

à  

% :

 |
 
 
 à
  %  
%)))))))))  

 
  &!&%     
 | J &6 K%  :à    %
 ,
 | J &6+K%  ::    
 | J &6$K%  ::    
 | J &6#K%  :|    
)))))))))))

 
à  +
Emplacement de sous-programmes

(      8* 


  )3   
   )
! * "  :
     
  )&  **   
3&    
 )

à  4
( 
&Pà  
B'B(&Pà  
!&'(!(P3(
B!B|/
àà&,
!&'((
à!
!à|B|!(P3(
B
 à  +7$ 4
 à  ,
M  7.Q.
M 7.Q.
=
!à|B|(
à!
! à(!(P3(
B
|!!3(!
! à(à!
!à|B|
3&
&Pà% * 


3 |
3 |@
'à' @%
3&|@
(* 
3 @
3 @|@
3&
* 

(B%&Pà  @


&Pà(
à&%* &Pà
à  $
 à( B

    
   
  !'% "  
 3  4%8 
  @  J!'K
 '
!'
 

 3& 
 (* 
    J!'K
 &Pà
 '
!'
 à(
 3&
 < 
%&Pà     @

à  7
  %    8**   **   &Pà   @
 
  ** M
  ** M %  8
  
 
 
%    *   $ 
 

* M
+#
 ;J K
 

 
* M

+#
 ;J K
%M    8" 
 
  ** M  
 

à  #
M

  
* M
 ;J K
 ;J K


 M
* M

 ;J K

 ;J K

 ;J K.Q.
  ** M  
 9
 
! 
3 | +%
' 
! à((
à!
(
àà( B

à  9
    
       
 : :  
   
 * :)
 !  8 "   8
"      R
  8 8"  

  ;   



   Ä Ä   Y YY  r r 

à   
Traitement des tableaux et
chaînes de caractères

 : |!''   "  : 


 TQ");:    3!à !)
: |!'' 8"   à

( 

 à T Q"
 3 à .  Q. 2 
3 à . ...... ........Q.
3 à $$$9+ $
    :.Q.   *  
    8      **  
: )

à  à&,TQ"% :  *  


Bà  4à&TT% 4  
 à TT%T5" ,TQ"

à   
 (  "     
: : )|     
"8)

 %|ð 0J K% G


 !'
 |0J!'K
 %J Kð |% G
 à'
 0Jà'K|

Remarque:    !'à'  2     **


  ")

à  
 (    "
%| ð  T"
%!' " 
 !'
3 | 
 
3&0J!'KTQ"% * Q
|= 
'*
3&0J!'KT"

( *
'
|
( *
'
!'
3&= 
(= 

à  
|   
  !' 

!'0%!' " 0


3 | 
 
3&;&BJ!'KTQ"%  *   
|= 
'*
3&;&BJ!'KT"

( *
'
|
( *
'
!'
3&= 
(= 

à   +
Les vecteurs

Vecteur d¶entiers
   2 "  O
  E  )& "   E   
     "
)

( 

B=+7% +         


%   +7
B=,%       )

à   4
'      

'   +


à  +4$7
II
I  I  I  I  I


< "  


 
6 5"

  :

à   $
 ( 

%| ð J K
 !'
|àà!'!'%!'!'5 "
3 | J!'K

%J Kð |
3 !'
|àà!'!'
3 J!'K| 

à   7
Tableau à deux dimensions
* "    8      
 )P      
  )

Exemple:
        
         
         

'  
    
                      
  +4$7#9  4$7#9     +

à   #
!      %
      

| 
6 5"   
6 5"  

 "J KJ K

à   9
Exemple 8 : parcours d'un tableau
 :    )*  
:Q)   (B   4:   
  |!'')

B 
   E
,
 
!(P3(
B
à .*  ..Q.
(
à!
!(P3(
B
|!!3(à!
!


3 | 
3 à!| 
3  **  % 

3 |J K % :
|
à| %* 480
3 J K| %:
'
  %   
3&|.Q. % Q* ,

( % 
3 |@+@
'
B @%à !
(
à!
(
à

à   
Les instructions de traitement
de chaînes de caractères

        **    


   ) "     
  :    )

3 !  


!|! 
3&! 
 à!  
!B !  

      *   2  

à   
) *          
   
 "  0   
          
  ) "   à
   *  8"   !Bà  
8
) "   8** 2  

) "   "  
  à!!')"  
 :   (!à'
+)  * "   )

à  
 *      

 (&(&:" *  




 (&((&:" ""  


  **

 (&
((&
:" " **
   **

à  
         : **     
        )

Instruction Mnémonique Destination Source Préfixe


Dep. Ch. Oct. MOVSB ES:DI DS:SI REP

Dep. Ch. Mot MOVSW ES:DI DS:SI REP

Sav. Ch. Oct. STOSB ES:SI AL REP

Sav. Ch. Mot STOSW ES:SI AX REP

Chg. Ch. Oct. LODSB AL DS:SI /

Chg. Ch. Mot LODSW AX DS:SI /

Cmp. Ch. Oct. CMPSB ES:DI DS:SI REPE/REPNE

Cmp. Ch. Mot CMPSW ES:DI DS:SI REPE/REPNE

Scn. Ch. Oct. SCASB ES:DI AL REPE/REPNE

Scn. Ch. Oct. SCASW ES:DI AX REPE/REPNE

à °   
ð ±     °
     °
         
Ä à ð  v à ð 

à   +
          "
 "   3 !     R
 !; 
3 ! 
 à   
 " à!
!'8
" (!
à')! à<  à'!' 
         )
 
&    * 
(&3 !       R)
" 8  2   
 2 &)
 ( 


à   4
à   $
 l¶instruction SCASB    R
 !; 
!|! 
 à   
" (!
à' |) 
          )! à< 
 à'       )
 
&   * >(&!|! ?
>(&(!|! ?     R>(&
!|! ?    !  R)  *     )
" 8 2    )
   "2    : 
(!
à' 2  | )) < ) 
  : )
&  Y  < 
" 8   "8|: (!
à'
    (&
((&
)
 ( 


à   7
à   #
l¶instruction LODSB    R
 !; 
 à! 
 à   
 |" à!
!')! à<  !' 
      )
 
&   "   *    2
3 ! )

l¶instruction STOSB     R


 !; 
!B ! 
 à   
!E| " (!
à')! à< 
 à'       )
 
&   "   *    2
 à! )

l¶instruction CMPSB  Ä   R


 !; 
3&! 
 à   
" à!
!'  (!
à')! à<
  !'à'          )
 
&   "   *    2
!|! )

à   9
Exemple: REP MOVSB et CLD

TITLE PROG3_12.asm ;Transfert un bloc de 20 octets dans la mémoire


pile segment stack
dw 100 dup (?)
pile ends
data segment
DATA_S DB µAQWERTTYUIOPLJKHGFDS¶
DATA_D DB 20 DUP(?)
data ends
Code segment
assume CS:Code, ES:data, DS:data
MAIN
 MOV AX,DATA
 MOV DS,AX ; Initialiser le segment de données
 MOV ES,AX ; Initialiser le segment Extra
 CLD ; DF=0 ð Auto-incrémentation des pointeurs SI et DI
 MOV SI,OFFSET DATA_S ; Charger le pointeur source
 MOV DI,OFFSET DATA_D ; Charger le pointeur destination
 MOV CX, 20 ; Charger le compteur
 REP MOVSB; Déplacer les octets pointés par SI vers des locations pointés par DI
 ; et répète jusqu¶à CX ð 0, sachant qu¶a chaque itération SI et DI sont
 ; automatiquement incrémentés
 MOV AH,4CH
 INT 21H ;ð DOS
 Code ENDS
 END MAIN


à  +
TITLE Exemple:LODSB , REP STOSW et CLD

pile segment stack


dw 100 dup (?)
pile ends
data segment
DATA_S DB µAQWERTTYUIOPLJKHGFDS¶
DATA_D DB 20 DUP(?)
MESSAGE DB µ Mémoire défectueuse¶
ESP_MEM DB 100 DUP(?)
data ends
CODE segment
Assume CS:CODE, DS:data, ES: data
MAIN:
MOV AX,DATA
MOV DS,AX ; Initialiser le segment de données
MOV ES,AX ; Initialiser le segment Extra
CLD ; DF=0 ð Auto-incrémentation des pointeurs SI et DI
MOV CX, 50 ; Charger le compteur avec 50 (50 mots = 100 octets)
MOV DI,OFFSET ESP_MEM ; Charger le pointeur destination
MOV AX, 0CCCCH ; le pattern qui servira de test
REP STOSW ; Placer AAAAH dans 50 locations mémoires pointées par DI (jusqu¶à CXð0)
; sachant qu¶a chaque itération DI est automatiquement incrémenté
MOV SI,OFFSET ESP_MEM ; Charger le pointeur source
MOV CX, 100 ; Charger le compteur avec 100 (100 octets)
ENCORE: LODSB ; Charger de DS:SI vers AL (pas de REP)
XOR AL, AH ; Est ce que le pattern est est le même, sachant que dans AL et AH se trouve CCh
JNZ PASSE ; Sortir du programme si c¶est différent ð mémoire défectueuse
LOOP ENCORE ; continue jusqu¶a CXð0
JMP SORTI
PASSE: MOV DX, OFFSET MESSAGE ; Afficher un message sur écran
MOV AH,09H ; le message est µMémoire défectueuse¶
INT 21H ;ð DOS
SORTIR:MOV AH,4CH
INT 21H ;ð DOS
CODE ENDS
END MAIN

à  +
Exemple: REPE CMPSB et CLD
B'B( & P) %  * ""**   
&'(!(P3(
B E
àà&,
&'((
à!
à!(P3(
B
3 BM( |Bà T@' B'3'"
3 BMB|&((à T'@ B'3'"
3(!!|P( à T"   "TQ"
3(!!|P( à T" * " TQ"
à|B|(
à!
 à(!(P3(
B
|!!3(!
à!
(!

3|'

3 | à|B|
3 à!| %'    
3 (!| %'    ( 
à %à<ð |     !'à'
3 !' <<!(B3 BM( |B%  
3 à' <<!(B3 BMB|&((%    
3   %     
(&(3&! %      )
%! "  **     )|
%"8   !'à'     )
(&|!!( %! <**   
3 à  <<!(B3(!!|P(  %! <**    **
3&|<<'@|P(

&|!!(
3 à  <<!(B3(!!|P(
|<<'@|P(
3 |@9@%  T3 * "
'
B @%ð à !

 à((
à!
(
à3|'

à  +
Exemple: REPNE SCASB et CLD

TITLE PROG12.asm ; Balayer une chaîne de caractère et Remplacer une lettre particulière par une autre
Pile segment stack
dw 100 dup(?)
Pile ends
Data segment
CHAINE DB µMr. Gones¶ , µ$¶
Data ends
Code segment
MAIN: assume CS:code, DS:Data, ES:Data
MOV AX,DATA
MOV DS,AX ; Initialiser le segment de données
;MOV ES,AX ; Initialiser le segment Extra
CLD ; DF=0 ð Auto-incrémentation des pointeurs SI et DI
MOV DI, OFFSET CHAINE ; Charger le pointeur destination ES:DI
MOV CX, 9 ; Charger le compteur avec 9 (la taille de la chaîne de caractères)
MOV AL, µG¶ ; le caractère a scanner (balayer)
REPNE SCASB ; Répéter le balayage tant que les deux lettres ne sont pas égales ou jusqu¶a C= 0.
JNE PASSE ; Saut si ZF=0 afficher le message 1 (égalité)
DEC DI ; Décrémenter DI (a la lettre G) car entre autre DI s¶est automatiquement incrémenté
MOV BYTE PTR[DI], µJ¶ ; Remplacer µG¶ par µJ¶
PASSE: MOV DX, OFFSET CHAINE
AFFICHAGE: MOV AH,09H ; le message correcte est affiche: µMr. Jones¶
INT 21H ;ð DOS

Code ENDS
END MAIN

à  +
à!(P3(
B
  ,
  ,
à(
à!
 à(!(P3(
B
|!!3(!
 à(à!
à(!
à
3 | à
3 à!|
3 (!|
(
B((

%       *


à%  
%       : T|"
3 |T|"%:  
3   %
(|à' %à' "  
(&!B !

à  ++
%**  
3   
(|!' 
3 |@ %* à !** ":

 à!
3 à|
'
B @
 & 
%       :  
3  
(|!' 
(|à'  
(&3 !

à  +4
%: 
3  
(|à' 
3 |" "%:8
(&
(!|!

(M 
3 à" "
3&**
M 

3 à"
"
**
3 |@
'
B @

à  +$
% 
3  
(|!' 
(|à' 
(&(3&!

(M  
3 à" "
3&**
M  

3 à"
"
**

3 |@
'
B @
3 | +@
'
B @
 à((
à!
(
à(
B((

à  +7
 
 à*   

    
 * 82
      

à  +#
< "* 
 

  "   


entre autres  : " 
" )

à  +9
Calculer le factoriel de n, noté n!

 Le problème est: * .


 )

 En entrée:
      
   8)

 Sortie:
     
 * )

à  4
 Fonction principale
  *
  
 F  > 
?
 
 ** 
  >* ?> ?*

 Ofactoriel  * ;

 entier factoriel(entier)
à  4
Fonction factoriel

*  


{
F
5* )
}

à  4
*  ,
On a besoin d¶une pile!
 (**8 * :
       )
   "    "8
:"  )
 8* "  * 
)
 (   "  
    *  
)    
 "8"  
:)

à  4
     
B'B(* 
&'(  E
=,
   =
&'(
à 

=+
*=,
à
 
 !
à!
à!!
& 
à

3 | à
3 à!|
3 | & 
3 !!| %      
3 !&  % .    !&
  %   
  
* 

< 
| % * *   |
 *|
 | +
 

à  4+
* 
 
 

3&| 
( %   "8
|
 |
3& 

à 

& &| 
& &
 
& |
3& 
 

* %* 

%* 

à  44