Rechercher dans ce blog

samedi 5 mars 2011

Tp assembleur


TP 2

Introduction

Macros
Une macro-instruction ou macro est une séquence d'instructions et de directives que
l'assembleur traite quand il rencontre le nom de la macro dans un programme. Il crée
alors habituellement du nouveau code source. Cette facilité peut être utilisée comme une
sorte de sténographie pour le programmeur. On remplace du code fréquemment utilisé
par une macro. Ceci rend le code source plus rapide à écrire et plus compact. Le code
objet n'est cependant pas plus court que si l'on n'utilisait pas de macros, contrairement à
un sous-programme utilisé plusieurs fois dans un programme.
nom MACRO [[paramètre [[.REQ | :=default | :VARARG]] ]]...
Indique le début de la définition d'une macro appelée nom.
ENDM [[valeur]]
Indique la fin de la définition d'une macro. Retourne valeur à l'énoncé appelant.
EXITM
Branche à l'énoncé qui suit la macro.
LOCAL nom
Utilisée pour créer une étiquette nom à l'intérieur d'une macro.
Code Source


.model small
.stack 100H 
.data             
msg db  "  donnez la chaine de carcteres qui se termine par le caractere *  ","$"                                                          
msg2 db " ; la taille de chaine est:  ","$"
msg3 db " ; le nombre de separateur est:  ","$"
msg4 db " ; le nombre de mot est:  ","$"
msg5 db " ; le caractere le plus recurrent est:  ","$"
msg6 db " ; il n'ya pas de mot car la chaine est vide:  ","$"
msg7 db " ; le mot le plus lang est:  ","$"
msg8 db " ; il n'y a pas de mot car une chaine des separateur:  ","$"
msg9 db " ; iln'y a pas de caractere recurrent car la chaine est vide:  ","$"
chcar db 200 dup ("$")
langch dw ?
nbseparateur dw ?
nbmots dw ?
lecaracter db ?
ltrouve dw ?
ind1trouve dw ?
ind2trouve dw ?
.code  
;remplisage   
saisie macro t                  
         mov ah,9
         lea dx,msg
         int 21h  
         mov si,0      
     remplire:
            mov ah,1
            int 21h 
            mov t[si],al
            inc si
            cmp al,"*"
            jne remplire
endm            
;la taille de la chaine de caracter
taille macro tai,t

     mov bp,0
          mov si,0
    tantque:
            mov bl,t[si]
            cmp bl,"*"
            je fintantque
            inc bp
            inc si
            jmp tantque
    fintantque:
    mov tai,bp
    mov ah,9
    lea dx,msg2
    int 21h
    mov ax,bp
    mov cl,10
    div cl
    mov bl,ah
    mov ah,2
    mov dl,al
    add dl,48
    int 21h
    mov ah,2
    mov dl,bl
    add dl,48       
    int 21h
endm
;le nombre de mots
Nmots macro lch,nm,t
mov bx,0
mov bp,lch
for: mov si,1
     jmp test
next:
  if: cmp t[si],' '
       je et
      cmp t[si],','
       je et
      cmp t[si],';'
       je et
      cmp t[si],"'"
       je et
      cmp t[si],'.'
       je et
      cmp t[si],':'
       je et
     jmp endif
    et:
      mov di,si
      sub di,1
      cmp t[di],' '
       je endif
      cmp t[di],','
       je endif
      cmp t[di],';'
       je endif
      cmp t[di],"'"
       je endif
      cmp t[di],'.'
       je endif
      cmp t[di],':'
       je endif
     alore: add bx,1
    endif:
    inc si
test: cmp si,bp
      jl next
endfor:
 mov cx,lch
 sub cx,1
 mov si,cx

 if2: cmp lch,0
       je endif2
      cmp t[si],' '
       je endif2
      cmp t[si],','
       je endif2
      cmp t[si],';'
       je endif2
      cmp t[si],"'"
       je endif2
      cmp t[si],'.'
       je endif2
      cmp t[si],':'
       je endif2
 alore2: add bx,1 
 endif2:
 mov nm,bx
mov ah,9
mov dx,offset msg4
int 21h 
mov ax,nm
mov cl,10
div cl
mov bl,ah
mov ah,2
mov dl,al
add dl,48
int 21h
mov ah,2
mov dl,bl
add dl,48
int 21h   
endm
;le mot le plus lang
motpl macro lch,t
mov ltrouve,0
si33: cmp lch,0
    je finsi33
for33: mov si,0
     jmp test33
next33:
     si23:cmp t[si],' '
          je finsi23
          cmp t[si],','
          je finsi23
          cmp t[si],';'
          je finsi23
          cmp t[si],':'
          je finsi23
          cmp t[si],'.'
          je finsi23  
     mov cx,0 ;lmot dans cx
     mov ax,si ;ind1 dans ax
      repeter33: 
     add si,1
     add cx,1
    
     cmp t[si],' '
     je finrepeter33
     cmp t[si],','
     je finrepeter33
     cmp t[si],';'
     je finrepeter33
     cmp t[si],':'
     je finrepeter33
     cmp t[si],'.'
     je finrepeter33     
     cmp si,lch
     jnl finrepeter33    
     jmp repeter33    
     finrepeter33:    
     mov bx,si
     sub bx,1 ;ind2 dans bx  
     si332:cmp cx,ltrouve
         jng finsi332
         mov ind1trouve,ax
         mov ind2trouve,bx
         mov ltrouve,cx
     finsi332:  
      finsi23:    
     inc si
test33:  cmp si,lch
       jl next33
endfor33:
finsi33:
;affichage du mot le plus lang
if44: cmp lch,0
      jne tdsepa
         mov ah,9
         lea dx,msg6
         int 21h
      jmp endif44
tdsepa:mov di,ind1trouve
         cmp t[di]," "
         je tds
         cmp t[di],"'"
         je tds
         cmp t[di],","
         je tds
         cmp t[di],"."
         je tds
         cmp t[di],";"
         je tds
         cmp t[di],":"
         je tds
       mov di,ind2trouve
         cmp t[di]," "
         je tds
         cmp t[di],"'"
         je tds
         cmp t[di],","
         je tds
         cmp t[di],"."
         je tds
         cmp t[di],";"
         je tds
         cmp t[di],":"
         je tds
         jmp else44
   tds: mov ah,9
        lea dx,msg8
        int 21h
        jmp endif44    
else44:
         mov ah,9
         lea dx,msg7
         int 21h
      for44: mov di,ind1trouve
             jmp test44
      next44:
        mov ah,2
        mov dl,t[di]
        int 21h
            inc di
      test44: cmp di,ind2trouve
             jle next44
      endfor44:
endif44:        
endm
;nombre de separateur
nseparateur macro lch,ns,t   
 mov ax,lch
 mov si,0
 mov bp,0
 repeter1:
switch:cmp t[si],' '
       jne case1 
       add bp,1     
case1: cmp t[si],','
       jne case2     
       add bp,1     
case2: cmp t[si],';'
       jne case3               
       add bp,1     
case3: cmp t[si],'.'
        jne case4
       add bp,1
case4: cmp t[si],"'"
       jne case5
       add bp,1      
case5: cmp t[si],':'
       jne default      
        add bp,1            
default: add bp,0
inc si               
cmp si,ax
jl repeter1 
mov ns,bp
;affichage du nombre de separateur
mov ah,9
mov dx,offset msg3
int 21h 
mov ax,bp
mov cl,10
div cl
mov bl,ah
mov ah,2
mov dl,al
add dl,48
int 21h
mov ah,2
mov dl,bl
add dl,48
int 21h
endm
;le caracter le plus recurent
recurrent macro lch,lecar,t
mov ax,lch     
mov cx,0
mov si,0
mov bx,0
repeter2:
mov bp,0
mov dl,t[si]
mov di,0
 repeter22:
    if4:cmp dl , t[di]
        jne endif4
    alors:add bp,1
          jmp endif4
    endif4:
    inc di
    cmp di,ax
 Jl repeter22
 if3:cmp bp,cx
     jle endif3
 then:mov cx,bp
      mov bl,t[si]
      jmp endif3
 endif3:
 inc si
 cmp si,ax
Jl repeter2 

mov lecar,bl
;affichage du caracter le plus recurrent
cmp bl,"*"
    jne affi 
    mov ah,9
    mov dx,offset msg9
    int 21h
    jmp fin
affi:    
mov ah,9
mov dx,offset msg5
int 21h                 
mov ah,2
mov al,bl
mov dl,al
int 21h
fin:
endm
   main proc    
         mov ax,@data
         mov ds,ax       
   saisie chcar
   taille langch,chcar
   Nmots  langch,nbmots,chcar
   motpl  langch,chcar 
   nseparateur langch,nbseparateur,chcar
   recurrent langch,lecaracter,chcar
    mov ax, 0 ;attendre l'utilisateur pour terminer le programme
    int 16h                  
.exit
main endp
end main 

Demarche

On a écrit le code source sur le wordpad pius on la enregistré sous une extension (.asm) dans le dossier c:\tasm\bin
Puis on à utuliser l’invite de commande qui est accessible à partir de menu demarrer comme suit :
Demarrer\exécuter\cmd
Puis on a écrit  Cd tasm\bin
On a  Tapé   : 1-tasm32 sh.asm
                         2- tlink sh.obj
                        3-Pour tester le programme on tape  : sh.exe
Conclusion
Un programme developpé en langage asembleur est un programme assez rapide au niveau de l’exécution qu’un autre programme developpé avec un langage evolué, en effet un langage assembleur est très proche  de la machine et il occupe le moindre espace mémoire. Ne moins sa programmation est tres defficile à  métrisé. 

Aucun commentaire:

Enregistrer un commentaire