Bonjour,
Voila, je dois faire une présentation en ASM.
1. Entrez un matricule de au moins et au maximum 4 chiffre uniquement
2. Saisir le nom et prenom de l'eleve
3. Saisir 2 cotes
4. Moyenne de ces 2 cotes
Mais j'ai un problème avec la saisie du matricule. Les lettres sont bloqué( OK ) mais la saisie ne s'arrete pas a 4 chiffre, elle continue sur la fenetre alors qu'elle devrait sauter a la saisie du nom. Je ne trouve pas d'ou cela provient.
Voila les sources, le programme principal et les procedures (la procedure matricule se situe tout a la fin). Si vous trouvez d'autre bug d'affichage ou autre merci de me le dire.
SVP tester, MERCI d'avance
Programme principale
.MODEL SMALL
.STACK
.DATA
carmatricule db 5,?,5 dup(' ')
carnom db 40,?,40 dup(' ')
carprenom db 40,?,40 dup(' ')
recommencer db 'Appuyer sur ENTER pour recommencer ou sur ESC pour arreter$'
nbrcote1 db ?
nbrcote2 db ?
moyene db 5 DUP(' ')
svg db ?
tmp1 db ?
tmp2 db ?
.CODE
INCLUDE e:\asm\ex\saisie.asm
;Début du programme
MAINPROG:
CALL ecran
MOV dh,5
MOV dl,40
CALL matri
MOV dh,10
MOV dl,14
CALL lettre
MOV dh,12
MOV dl,17
CALL lettre
;saisie nbr1
MOV DH, 14
MOV DL, 17 ;Position du curseur
CALL nombre
MOV nbrcote1,dl
;saisie nbr2
MOV dh,16
MOV dl,17 ;Position du curseur
CALL nombre
MOV nbrcote2,dl
MOV dh,20
MOV dl,19 ;Position du curseur
MOV ah,02h
INT 10h
MOV al,nbrcote1
ADD al,nbrcote2 ;Additon des 2 cotes
XOR ah,ah
MOV dx,2
CALL division
push ax ;Sauve le reste de la division
MOV bx,dx ;svg dx
ADD dx,dx ;2*dx
ADD dx,bx ;3*dx
ADD dx,bx ;4*dx
ADD dx,bx ;5*dx
CMP ax,0
JE ENTIER ;Si division entière
JNE REEL ;Si division avec reste
REEL:
INC DX
INC DX
MOV AX,DX
MOV bx,offset moyene
MOV di,5
SUITE2:
MOV dx,10
CALL DIVISION
ADD al,30h ;Récupere le chiffre
MOV [bx][di],al ;Place dans le vecteur
DEC di
MOV AX,DX
CMP AX,0
JA SUITE2
INC di
AFFICH1:
MOV dl,[bx][di]
MOV ah,02h
INT 21h
INC di
CMP di,5
JBE AFFICH1
MOV dl,',' ;Affiche une virgule
MOV ah,02h
INT 21h
MOV dl,'5' ;Affiche le reste
MOV ah,02h
INT 21h
JMP SUITE1
ENTIER:
MOV AX,DX
MOV bx,offset moyene
MOV di,5
SUITE3:
MOV dx,10
CALL DIVISION
ADD al,30h ;Récupere le chiffre
MOV [bx][di],al ;Place dans le vecteur
DEC di
MOV AX,DX
CMP AX,0
JA SUITE3
INC di
AFFICH2:
MOV dl,[bx][di]
MOV ah,02h
INT 21h
INC di
CMP di,5
JBE AFFICH2
MOV ah,02h
MOV dl,' ' ;N'affiche rien
INT 21h
MOV ah,02h
MOV dl,' ' ;N'affiche rien
INT 21h
MOV ah,02h
MOV dl,'%' ;Affiche le pourcentage
int 21h
SUITE1:
MOV dh,22
MOV dl,10 ;Positionne le curseur
MOV ah,02h
INT 10h
MOV dx,offset recommencer ;Demande à l'utilisateur si il veut recommencer
PUSh AX
MOV AX, 0900h
INT 21h
POP AX
MOV ah,1
INT 21h
CMP al,1Bh
JE FINPROG ;Si ESC
JNE SAUTRET ;Sinon aller SAUTRET
SAUTRET:
JMP MAINPROG ;Rcommencer
FINPROG:
MOV ax,4C00h
INT 21h
END MAINPROG
Procedures
.MODEL SMALL
.STACK 100h
.DATA
matricule db 'MATRICULE:....$'
nom db 'NOM:...........................................$'
prenom db 'PRENOM:.....................................$'
cote1 db 'COTE 1:../20$'
cote2 db 'COTE 2:../20$'
moyenne db 'MOYENNE :..,.%$'
.CODE
;Ecran
ECRAN PROC
MOV ax,@DATA
MOV ds,ax
MOV ah,0Fh
INT 10h
MOV ah,0h
INT 10h
MOV dh,5
MOV dl,30
MOV ah,02h
INT 10h
MOV dx,offset matricule
MOV ah,09h
INT 21h
MOV dh,10
MOV dl,10
MOV ah,02h
INT 10h
MOV dx,offset nom
MOV ah,09h
INT 21h
MOV dh,12
MOV dl,10
MOV ah,02h
INT 10h
MOV dx,offset prenom
MOV ah,09h
INT 21h
MOV dh,14
MOV dl,10
MOV ah,02h
INT 10h
MOV dx,offset cote1
MOV ah,09h
INT 21h
MOV dh,16
MOV dl,10
MOV ah,02h
INT 10h
MOV dx,offset cote2
MOV ah,09h
INT 21h
MOV dh,20
MOV dl,10
MOV ah,02h
INT 10h
MOV dx,offset moyenne
MOV ah,09h
INT 21h
MOV dh,5
MOV dl,40
MOV ah,02h
INT 10h
RET
ECRAN ENDP
;Division
DIVISION PROC
PUSH si
PUSH di
PUSH cx
MOV si,ax
MOV di,dx
XOR ax,ax
XOR dx,dx
MOV cx,16
NEXT:
ROL si,1
RCL ax,1
ROL dx,1
CMP di,ax
JA NEXT2
INC dx
SUB ax,di
NEXT2:
LOOP NEXT
POP cx
POP di
POP si
RET
DIVISION ENDP
;Saisie Nombre
nombre PROC
MOV tmp1, DH ;Met dans tmp1 la valeur de DH
MOV tmp2, DL ;Met dans tmp2 la valeur de DL
PLACE:
MOV dh,tmp1 ;Met dans DH la valeur de tmp1
MOV dl,tmp2 ;Met dans DL la valeur de tmp2
MOV ah,02h
INT 10h
MOV ah,02h
MOV dl,'.'
int 21h
MOV ah,02h
MOV dl,'.'
int 21h
MOV dh,tmp1
MOV dl,tmp2
MOV ah,02h
INT 10h
MOV dx,0 ;Initialise le résultat
MOV cx,0
ENCORE1:
MOV ah,1
INT 21h
CMP al,0Dh ;Compare si ENTER
JNE SUIT1
CMP cx,0
JE POSITION
JNE FIN1
SUIT1:
CMP al,30h ;Compare si c'est un chiffre
JL POSITION ;Si il est plus petit POSITION
CMP al,39h ;Compare si c'est un chiffre
JG POSITION ;Si il est plus grand POSITION
AND al,0Fh ;Récupére le nombre
ROL dx,1 ;2*dx
MOV bx,dx ;sauve dx
ROL dx,1
ROL dx,1
ADD dx,bx ;10*dx
XOR ah,ah ;ah=0
ADD dx,ax ;Met le nombre dans DX
INC cx
CMP cx,2
JE FIN1
JMP ENCORE1
POSITION:
push dx
MOV dh,tmp1
MOV dl,tmp2
ADD dl,cl
MOV ah,02h
INT 10h
POP dx
JMP ENCORE1
FIN1:
CMP dl,0
JL PLACE
CMP dl,20
JG PLACE
RET
nombre ENDP
;Lettre
lettre PROC
main:
MOV ah,02h ;Positionne le curseur
INT 10h
MOV DI,0
MOV BL, 0
DEBUT1:
MOV ah,1 ;Saisie de la lettre
INT 21h
CMP al,0Dh ;Compare a ENTER
JE verif
CMP al,61h ;Compare la lettre
JL SUIT2 ;Si plus petit que 'a' SUIT2
CMP al,7Ah ;Compare la lettre
JG SUIT2 ;Si plus grande que 'z' SUIT2
MOV [BX][DI],al ;Met la lettre dans le vecteur
INC BL
INC di
CMP di,cx ;Saisie stopper apres un certain nombre de lettre
JE FIN
JMP DEBUT1
verif:
CMP BL, 0
JE main
JNE FIN
SUIT2:
push dx
push cx
mov cx,di
ADD dl,cl
MOV ah,02h
INT 10h ;Positionne le curseur
MOV ah,02h ;Efface la lettre
MOV dl,'.'
int 21h
pop cx ;Réinitialise CX et DX
pop dx
push dx
push cx
mov cx,di ;Repositionne le curseur pour recommencer la saisie
ADD dl,cl
MOV ah,02h
INT 10h
pop cx
pop dx
JMP DEBUT1 ;Retourne au début de la saisie
FIN:
RET
lettre ENDP
;Saisie matricule
matri PROC
MOV tmp1, DH ;Met dans tmp1 la valeur de DH
MOV tmp2, DL ;Met dans tmp2 la valeur de DL
MOV dx,0 ;Initialise le résultat
MOV cx,0
ENCORE4:
MOV ah,1
INT 21h
CMP al,30h ;Compare si c'est un chiffre
JB POSITION4 ;Si il est plus petit POSITION
CMP al,39h ;Compare si c'est un chiffre
JA POSITION4 ;Si il est plus grand POSITION
AND al,0Fh ;Récupére le nombre
ROL dx,1 ;2*dx
MOV bx,dx ;sauve dx
ROL dx,1
ROL dx,1
ADD dx,bx ;10*dx
XOR ah,ah ;ah=0
ADD dx,ax ;Met le nombre dans DX
INC cx
CMP cx,4
JE FIN4
JNE ENCORE4
POSITION4:
push dx
MOV dh,tmp1
MOV dl,tmp2
ADD dl,cl
MOV ah,02h
INT 10h
POP dx
JMP ENCORE4
FIN4:
RET
matri ENDP