Vous êtes sur la page 1sur 5

Correction de la série N°2 – Programmation assembleur

Ex.2 : Quelques programmes

1- Affichage de l'alphabet en majuscule (alphabet.asm)

assume CS:Code
Code segment
main: mov DL,"A"
mov CX,26 ;compteur de la boucle pour affichage de 26 lettres de
; l’alphabet
mov AH,2 ; affichage
encore: int 21h
inc DL ;incrémentation de DL pour passer à l’alphabet suivant
Loop encore ; fin de la boucle
mov ah,4Ch
int 21h
Code Ends
End main

2- Saisie et Affichage d'un caractère (caracter.asm)

assume CS:Code
Code segment
main: mov AH,1 ; saisie
int 21h ; le caractère lu arrive dans AL
mov DL, AL
mov AH,2 ; affichage
int 21h
mov ah,4Ch
int 21h
Code Ends
End main

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)

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 début
fin: mov ah,4Ch
int 21h
Code Ends
End main

4- Affichage d'un octet en binaire : afficher la valeur contenue dans un registre 8 bits (BL).

1
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
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

Ex.3 : Saisie au clavier d'un nombre décimal

Le but de l'exercice est d'écrire un programme qui lit un entier décimal au clavier et le
sauvegarde en mémoire dans une variable de type octet N1.

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)
2. assume CS:Code

2
3. Code segment
4. main: mov AH,1 ; saisie
5. int 21h ; le caractere lu arrive dans AL
6. Cmp AL, "0"
7. JB pasbon ; si AL<"0" ce n'est pas un chiffre
8. Cmp AL,"9"
9. JA pasbon ; si AL>"9" ce n'est pas un chiffre
10. Sub AL,"0" ; sinon le chiffre= code ASCII-ASCII(0)
11. Mov N1, AL
12. jmp fin
13. pasbon: mov DL, "N"
14. mov AH,2 ; affichage de "N"
15. int 21h
16. fin: mov ah,4Ch
17. int 21h
18. Code Ends
19. 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

(deuxième méthode)

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

3- Ecrire maintenant un programme (numread.asm) qui lit un nombre décimal au


clavier et le sauvegarde dans N1. La lecture s'arrête quand le caractère lu n'est
pas un chiffre (plus besoin d'afficher "N"). On ne contrôlera pas le
débordement de capacité.

assume CS:Code, DS:Data


Data Segment
N1 db ?
Data Ends

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

3
jmp lecture
fin: mov ah,4Ch
int 21h
Code Ends
End main

Ex.4 : Complément à deux et nombre plus petit

1. complément.asm
assume CS:Code
Code segment
main: mov AL,[40H]
neg AL
mov [41H],AL
mov ah,4Ch
int 21h
Code Ends
End main

2. pluspetit.asm
assume CS:Code
Code segment
main: mov AL,[40H]
neg AL
mov [41H],AL
mov BL,[41H]
CMP BL,[40H]
JB SUITE ; si BL<[40H] alors saut vers SUITE
Mov [42H],[40H] ; sinon
SUITE : mov [42H],BL
mov ah,4Ch
int 21h
Code Ends
End main

Correction de l’examen TP
Ecrire un programme assembleur permettant de faire une boucle de saisie de caractère qui
s’arrête à la saisie du caractère spécial « # ». Pour chaque caractère saisi, s’il s’agit d’un
chiffre ( 0..9) le programme doit afficher « C » pour dire Chiffre. Sinon, le programme
affiche « N » pour dire Non.

assume CS:Code
Code segment
main: mov AH,1
int 21h
Cmp AL, "#"

4
JE FIN
Cmp AL,"0"
JB NON
Cmp AL,"9"
JA NON
mov DL, "C"
jmp AFFICHAGE
NON : mov DL, "N"
AFFICHAGE : mov AH,2 ; affichage
int 21h
jmp main
FIN: mov ah,4Ch
int 21h
Code Ends
End main