TD4 Assembleur-E+S
TD4 Assembleur-E+S
TD4 Assembleur-E+S
Exercice 1 :
Pour chaque cas, écrire un programme assembleur :
1. Affichage de l'alphabet en majuscule (alphabet.asm)
2. Saisie et Affichage d'un caractère (caracter.asm)
3. Modifier le programme précédent pour qu'il fasse la saisie et l'affichage tant que le
caractère saisi est différent de ^d (code ASCII 4)
4. Affichage d'un octet en binaire : afficher la valeur contenue dans un registre 8 bits (BL).
5. Modifier le programme caracter.asm pour qu'il affiche (en binaire) le code ASCII de
chaque caractère saisi.
1
Correction du TD
Exercice 1 :
Pour chaque programme, écrire un programme assembleur.
Affichage de l'alphabet en majuscule (alphabet.asm)
assume CS:Code
Code segment
main: mov DL,"A"
mov CX,26
mov AH,2
encore: int 21h
inc DL
Loop encore
mov ah,4Ch
int 21h
Code Ends
End main
Modifier le programme précédent pour qu'il fasse la saisie et l'affichage tant que le caractère saisi est
différent de ^d (code ASCII 4)
assume CS:Code
Code segment
main: mov AH,1 ; saisie
int 21h ; le caractere lu arrive dans AL
Cmp AL, 4
JZ Fin ; si AL=4 alors Fini
mov DL, AL ; sinon :
mov AH,2 ; affichage
int 21h
jmp main ; et retour au debut
fin: mov ah,4Ch
int 21h
Code Ends
End main
Affichage d'un octet en binaire : afficher la valeur contenue dans un registre 8 bits (BL).
L'idée est d'utiliser un masque BL AND 10000000 pour tester le bit de gauche, et de décaler BL à gauche pour
parcourir ainsi tous les bits.
assume CS:Code
Code segment
main: mov BL, 10 ; on teste le programme avec BL=10
mov CX,8 ; compteur de boucle
masque: Test BL, 10000000b
2
JNZ bit1
bit0: Mov DL,"0"
jmp affiche
bit1: Mov DL,"1"
affiche: mov AH,2 ; affichage
int 21h
SHL BL,1
Loop masque
fin: mov ah,4Ch
int 21h
Code Ends
End main
Modifier le programme caracter.asm pour qu'il affiche (en binaire) le code ASCII de chaque caractère saisi.
assume CS:Code
Code segment
main: mov AH,1 ; saisie
int 21h ; le caractere lu arrive dans AL
Cmp AL, 4
JZ Fin ; si AL=4 alors Fini
mov BL, AL
mov CX,8 ; compteur de boucle
masque: Test BL, 10000000b
JNZ bit1
bit0: Mov DL,"0"
jmp affiche
bit1: Mov DL,"1"
affiche: mov AH,2 ; affichage d'un bit
int 21h
SHL BL,1
Loop masque ; fin de la boucle d'affichage des 8 bits
jmp main ; et retour au debut
fin: mov ah,4Ch
int 21h
Code Ends
End main
1. Lire un caractère au clavier et tester si son code ASCII est celui d'un chiffre. Si c'est le cas, ranger ce
chiffre (et non son code ASCII) dans N1, sinon afficher "N". (oneread.asm)
assume CS:Code
Code segment
main: mov AH,1 ; saisie
int 21h ; le caractere lu arrive dans AL
Cmp AL, "0"
JB pasbon ; si AL<"0" ce n'est pas un chiffre
Cmp AL,"9"
JA pasbon ; si AL>"9" ce n'est pas un chiffre
Sub AL,"0" ; sinon le chiffre= code ASCII-ASCII(0)
Mov N1, AL
jmp fin
pasbon: mov DL, "N"
mov AH,2 ; affichage de "N"
int 21h
fin: mov ah,4Ch
3
int 21h
Code Ends
End main
2. A partir du programme précédent, écrire un programme (dixfois.asm) qui multiplie le nombre par
10 avant de le ranger dans N1
Remplacer N1<- AL-"0" par N1<- (AL-"0")*10
Sub AL,"0" ; sinon le chiffre= code ASCII-ASCII(0)
SHL AL,1
Mov N1,AL
SHL AL,1
SHL AL,1
Add N1,AL
Code segment
main: mov AX,Data
Mov DS,AX
Mov N1,0
lecture: mov AH,1 ; saisie
int 21h ; le caractere lu arrive dans AL
Cmp AL, "0"
JB fin
Cmp AL,"9"
JA fin
Sub AL,"0" ; sinon le chiffre= code ASCII-ASCII(0)
SHL N1,1 ; et N1 <- 10*N1 + AL
Mov BL,N1
SHL BL,1
SHL BL,1
Add N1,BL
Add N1,AL
jmp lecture
fin: mov ah,4Ch
int 21h
Code Ends
End main
Code SEGMENT
4
main : Mov AX, Data
Mov DS,AX
Mov AH, C
Mov SI, offset Tab ; (Mov SI, 0)
boucle: mov AH, [SI] ; (mov AH, Tab[SI])
cmp AH,"$"
je fin
aff: mov DL,AH
mov AH,2
int 21h
INC SI
jmp boucle
fin: Mov AH, 4Ch
Int 21h
Code ENDS
END main
2. Recherche d'un élément dans le tableau et affichage de l'élement s'il est trouvé (rech-aff.asm)
Assume CS:Code, DS:Data
Data SEGMENT
C db "H"
Tab db "B","C","D","G","H","J","L","$"
Data ENDS
Code SEGMENT
marche pas
main : Mov AX, Data
Mov DS,AX
Mov SI, 0
boucle: mov AH, Tab[SI]
cmp AH,"$"
je pas
aff: cmp AH,C
jne suite
mov DL,AH
mov AH,2
int 21h
jmp fini
suite: INC SI
jmp boucle
pas : mov DL,AH
mov AH,2
int 21H
fini: Mov AH, 4Ch
Int 21h
Code ENDS
END main
3.Recherche d'un élement dans le tableau et déclenchement du drapeau ZF si l'élement est trouvé
(cherche.asm)
Assume CS:Code, DS:Data
Data SEGMENT
C db "B"
Tab db "B","C","D","G","H","J","L","$"
Data ENDS
Code SEGMENT
main : Mov AX, Data
Mov DS,AX
Mov SI, 0
boucle: mov AH, Tab[SI]
cmp AH,"$"
je pas
5
cmp AH,C
jne suite
; ZF déjà déclenché automatiquement
jmp fini
suite: INC SI
jmp boucle
pas : and ax,ax ; ruse pour mettre ZF à 0
fini: Mov AH, 4Ch
Int 21h
Code ENDS
END main