Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- pile segment para stack 'pile'
- dw 512 dup(00)
- pile ends
- donnee segment
- _title_1 db ' _____________________________________',10,'$'
- _title_2 db '| |',10,'$'
- _title_3 db '| |',10,'$'
- _title_4 db '|Made by : Wissem Boujarra |',10,'$'
- _title_5 db '| |',10,'$'
- _title_6 db '|_____________________________________|',10,'$'
- _menu db ' 1:(+) 2:(-) 3:(x) 4:(/) ',10,' taper le numero de votre operation: $'
- _qn1 db ' n1 = $'
- _qn2 db ' n2 = $'
- _qn db ' n= $'
- _r_add db ' n1 + n2 = $'
- _r_sub db ' n1 - n2 = $'
- _r_mul db ' n1 x n2 = $'
- _r_div db ' n1 / n2 = $'
- _r_pgcd db ' PGCD(n1,n2) = $'
- _r_ppcm db ' PPCM(n1,n2) = $'
- _r_puissance db ' (x^2)= $'
- _quit db ' > quitter (y/n)? $'
- _ascii db '0123456789ABCDEF'
- donnee ends
- code segment
- wrLn proc near
- push ax
- push dx
- mov dl,10
- mov ah,2
- int 21h
- pop dx
- pop ax
- ret
- wrLn endp
- ;scanHex resultat dans AL
- ;si touche = entree -> F0h
- ;sinon la valeur du touche
- scanHex proc near
- assume cs:code,ds:donnee,ss:pile
- _sh_getch: ;definir l'etiquette
- mov ah,8 ;utlisation de l'interruption 8 pour l'acquisition d'un caractere sans echo
- int 21h
- ; entree ?
- cmp al,13 ;comparer al ? la valeur du retour chariot
- jne _sh_num ;al!=13 -> test numerique
- ;sinon al=13
- mov al,0F0h ;al prend la valeur 0f0h
- jmp _sh_out ;sortie du fct
- _sh_num: ;definir l'etiquette _sh_num
- cmp al,'0' ;comparer al au code ascii de 0
- jb _sh_getch ;al<0 -> resaisie
- ;al>=0
- cmp al,'9' ;comparer al au code ascii de 9
- ja _sh_alpha_maj ;al>9 -> test majuscul
- ;sinon al ? 0..9
- sub al,'0' ;al <- al - '0'
- jmp _sh_out ;sortie du fct
- _sh_alpha_maj: ;definir l'etiquette _sh_alpha_maj
- cmp al,'A' ;comparer al au code ascii de A
- jb _sh_getch ;al<A -> resaisie
- ;al>=A
- cmp al,'F' ;comparer al au code ascii de F
- ja _sh_alpha ;al>F -> test minuscul
- ;sinon al ? A..F
- sub al,'A'-10 ;al <- al + 10 - 'A'
- jmp _sh_out ;sortie du fct
- _sh_alpha: ;definir l'etiquette _sh_alpha
- cmp al,'a' ;comparer al au code ascii de a
- jb _sh_getch ;al<a -> resaisie
- ;al>=a
- cmp al,'f' ;comparer al au code ascii de f
- ja _sh_getch ;al>f -> resaisie
- ;sinon al ? a..f
- sub al,'a'-10 ;al <- al + 10 - 'a'
- jmp _sh_out ;sortie du fct
- _sh_out:
- ret
- scanHex endp
- ;resultat dans BX
- ;fait apel a scanHex qui utilise AX
- scanInt proc near
- push ax ;sauvegarder les registres ax cx et bx dans la pile
- push cx
- push dx
- mov bx,0 ;initialiser le registre bx ? 0
- mov ch,4 ;mettre la partie haute du registre cx ? 4
- _si_scanHex: ;definir les instructions de l'etiquette _si_scanHex
- call scanHex ; appeler la procedure scanHex
- cmp al,0F0h ;comparer la partie basses du regitres ax a la valeur qui defini le retour chariot
- je _si_out ;si la condition precedente est realise on effectue l'etiquette _si_out
- ;ajout de al dans bx
- mov cl,4 ;la partie basses du registre prend la valeur 4
- sal bx,cl;on effectue un decalage ? gauche de 4 bits
- add bl,al ;on addiitone la valeur decale ? bl
- ;affichage du lettre correspondante
- push bx ;on sauvegrade le registre bx
- lea bx,_ascii ;bx pointe le debut du tableau _ascii
- xlat ;assure la conversion ascii hexad?cimale
- mov dl,al ;utiliser l-interruption 2 pour l'affichage d'un seul caractere
- mov ah,2
- int 21h
- pop bx ;recuperer la valeur de bx dej? stocker
- ;codition du loop
- dec ch ;ch=ch-1
- cmp ch,0 ;comparer ch ? 0
- jne _si_scanHex ;c'est la condition n'est pas egale on exeute l'etiquette _si_scanHex
- _si_out: ;definir l'etiquette _si_scanout
- pop dx ;recuperer les valeurs des registres dx,cx et ax
- pop cx
- pop ax
- ret
- scanInt endp
- ;entree dans DX
- printInt proc near
- push ax ;sauvegarder le contenue des registres ax,bx,cx,dx
- push bx
- push cx
- push dx
- push dx
- lea bx,_ascii ;bx point sur le debut du tableau _ascii
- mov ch,0 ;affecter 0 pour la partuie haute du registre cx
- _pi_print_byte:;definir l'etiquette _pi_print__byte
- mov al,dh ;on ecrit dans al la valeur de ch
- mov cl,4 ; on definit dans cl le nombre de bits ? decaler
- shr al,cl ;onfait un decalage a droite par le nombre de cl
- xlat ;realise la conversion hexadecimale ascii
- mov dl,al ;utliser l'interuption 2 pour l'affichage d'un seul caractere
- mov ah,2
- int 21h
- mov al,dh
- and al,0fh
- xlat
- mov dl,al
- mov ah,2
- int 21h
- cmp ch,0
- jnz _pi_fin
- pop dx
- mov dh,dl
- inc ch
- jmp _pi_print_byte
- _pi_fin:
- pop dx
- pop cx
- pop bx
- pop ax
- ret
- printInt endp
- prog_addition proc near
- push ax ;sauvegarder les valeurs des registres ax,bx,cx et dx dans la pile
- push bx
- push cx
- push dx
- ;nbr 1 dans cx
- lea dx,_qn1 ;utiliser l'interruption 9 pour afficher le message_qn1
- mov ah,9
- int 21h
- call scanInt ;faire appel a la fonction scanInt
- mov cx,bx ;?crire la valeur de sortie de scanInt dans bx
- call wrLn ;appel ? la fonction retoutr ligne
- ;nbr 2 dans bx
- lea dx,_qn2 ;utiliser l'interruption 9 pour afficher le message _qn2
- mov ah,9
- int 21h
- call scanInt ;appeler la fonction scanInt qui lit les vombres entres par le clavier
- call wrLn ;faire retour a la ligne par la fonction wrln
- ;resultat
- lea dx,_r_add ;afficher le message de la r?sultat d'addtion par l'interuption 9
- mov ah,9
- int 21h
- mov dx,0 ;intialiser le registre dx ? 0
- add cx,bx ;faire de nombres d?ja saisie par le clavier par la commande add
- adc dx,0 ;ajouter le carry
- call printInt ;appel la fonction printInt pour afficher la resultat
- mov dx,cx ;
- call printInt ;faire a la fonction printInt pour afficher le r?sultat
- call wrLn
- pop dx ;recuperer les valeures des registres dx,cx,bx et ax
- pop cx
- pop bx
- pop ax
- ret
- prog_addition endp
- prog_soustraction proc near
- push ax ;sauvegarder les valeurs des registres ax,bx,cx et dx
- push bx
- push cx
- push dx
- ;nbr 1 dans cx
- lea dx,_qn1 ;faire appel a l'interruption 9 pour afficher le message _qn1
- mov ah,9
- int 21h
- call scanInt ;appeler la fonction sacnInt pourt le premier valeur
- mov cx,bx ;stocker le valeur saisie dans le registre cx
- call wrLn ;faire appel a la fonction retour ligne
- ;nbr 2 dans bx
- lea dx,_qn2 ;utiliser l'interruption 9 pour afficher le message _qn2
- mov ah,9
- int 21h
- call scanInt ;utliser la proc?dure scanInt pour la deuxieme valeur
- call wrLn ;faire un retour a la ligne
- ;resultat
- lea dx,_r_sub ;afficher du message _r_sub
- mov ah,9
- int 21h
- mov dx,0 ;initialiser le registre dx a 0
- sub cx,bx ;soustraire bx de cx le resultat est dans cx
- jns _ps_jumpOver
- ;resultat negatif
- mov dl,'-' ;afficher un seul caractere par l'interruption 2
- mov ah,2
- int 21h
- neg cx
- _ps_jumpOver:
- mov dx,cx ;tsoxker le contenu de cx dans dx pour pouvoir l'afficher
- call printInt
- call wrLn
- pop dx ;recuperer de la pile le contenue de dx,cx,bx et ax
- pop cx
- pop bx
- pop ax
- ret
- prog_soustraction endp
- prog_multiplication proc near
- ;mul source ->> dx:ax = ax * source
- push ax ;sauvegarde des valeurs des registres ax,bx,cx et dx
- push bx
- push cx
- push dx
- ;nbr 1 dans cx
- lea dx,_qn1 ;afficher du premier message de saisie via la fonction 9
- mov ah,9
- int 21h
- call scanInt ;saisir la valeur via la procedure scanInt
- mov cx,bx ;memoriser la valeur saisie dans cx
- call wrLn ;faire un retour ligne
- ;nbr 2 dans bx
- lea dx,_qn2 ;afficher le message pour la deuxieme saisie
- mov ah,9
- int 21h
- call scanInt ;permet la lecture de la valeur saisie
- call wrLn ;faire un retour ligne
- ;resultat
- lea dx,_r_mul ;afficher le message _r_mul
- mov ah,9
- int 21h
- mov ax,cx ;ecrire le contenu de cx dans ax
- mul bx ;mul bx ->> dx:ax = ax * bx
- call printInt ;affichage du resultat
- mov dx,ax ;le resultat est stocker par la suite dans ax pour povoir l'afficher
- call printInt
- call wrLn
- pop dx ;recuperer dx,cx,bx et ax
- pop cx
- pop bx
- pop ax
- ret
- prog_multiplication endp
- prog_division proc near
- ;DIV SRC ->> DX:AX / SRC >> q = AX , r = DX
- push ax ;sauvegarde ax,bx,cx et dx
- push bx
- push cx
- push dx
- ;nbr 1 dans cx
- lea dx,_qn1 ;afficher le premier message _qn1
- mov ah,9
- int 21h
- call scanInt ;saisie le premier valeur
- mov cx,bx ;sauvegarder la valeur saisie dans cx
- call wrLn ;faire un retour a la ligne
- ;nbr 2 dans bx
- lea dx,_qn2 ;saisie le deuxieme valeur
- mov ah,9
- int 21h
- call scanInt
- call wrLn
- ;resultat
- lea dx,_r_div ;afficher le message _r_div par l'interruption 9
- mov ah,9
- int 21h
- mov dx,0 ;initaliser dx
- mov ax,cx ;ecrire cx dans ax
- div bx ;DIV bx ->> DX:AX / bx >> q = AX , r = DX
- mov dx,ax ;stocker le resulatt dans dx
- call printInt ;afficher le resultat sur ecran
- call wrLn ;retour ligne
- pop dx ;recuperer les valeur de dx,cx,bx et ax
- pop cx
- pop bx
- pop ax
- ret
- prog_division endp
- pgcd proc near
- push ax ;sauvegarde le contenu ax,bx et cx
- push bx
- push cx
- _pgcd_cmp:
- cmp bx,cx ;comparer bx et cx
- je _pgcd_end ;sauter a l'etiquette
- cmp bx,cx ;comparer bx a cx
- ja _pgcd_over ;si bx>cx faire un saut a _pgcd_over
- sub cx,bx ;cx=cx-bx
- jmp _pgcd_cmp
- _pgcd_over:
- sub bx,cx ;bx=bx-cx
- jmp _pgcd_cmp
- _pgcd_end:
- mov dx,bx ;le resultat est dans dx
- pop cx ;recuperer cx,bx et ax
- pop bx
- pop ax
- ret
- pgcd endp
- prog_pgcd proc near
- push ax ;sauvegarde ax,bx,cx et dx
- push bx
- push cx
- push dx
- ;nbr 1 dans cx
- lea dx,_qn1 ;afficher le message: n1=
- mov ah,9
- int 21h
- call scanInt ;lire la valeur saisie
- mov cx,bx ;la mettre dans cx
- call wrLn ;faire un retour ligne
- ;nbr 2 dans bx
- lea dx,_qn2 ;afficher le message:n2=
- mov ah,9
- int 21h
- call scanInt ;lire la valeur saisie
- call wrLn ;appel a la procedure retour ligne
- ;resultat
- lea dx,_r_pgcd ;afficher le message _r_pgcd
- mov ah,9
- int 21h
- call pgcd ; dx = pgcd(cx,bx)
- call printInt ;afficher la valeur du pgcd
- call wrLn
- pop dx ;recuperer les valeurs de dx,cx et bx
- pop cx
- pop bx
- pop ax
- ret
- prog_pgcd endp
- prog_ppcm proc near
- push ax ;sauvegarde des registres ax,bx,cx et dx dans la pile
- push bx
- push cx
- push dx
- ;nbr 1 dans cx
- lea dx,_qn1 ;afficher le premier message _qn1
- mov ah,9
- int 21h
- call scanInt ;lire la valeur saisie par l'utlisateur
- mov cx,bx ;la stocker dans cx
- call wrLn ;un retour a la ligne par wrln
- ;nbr 2 dans bx
- lea dx,_qn2 ;lire la deixieme valeur saisie
- mov ah,9
- int 21h
- call scanInt ;lire la valeur
- call wrLn ;faire un retour a la ligne
- ;resultat
- lea dx,_r_ppcm ;afficher le messge _r_pgcd
- mov ah,9
- int 21h
- call pgcd ; dx = pgcd(cx,bx)
- mov ax,bx ;ecrire le contenu de bx dans ax
- mov bx,dx ; bx = pgcd
- mul cx ; dx:ax = ax * cx
- div bx ;faire la division (ax*vx)/bx
- mov dx,ax ;ecrire ax dans dx
- call printInt ;afficher la valeur de ppcm
- call wrLn ;faire un retour ligne
- pop dx ;recuperer le contenu de dx,cx,bx et ax par le directive pop
- pop cx
- pop bx
- pop ax
- ret
- prog_ppcm endp
- prog_puissance proc near
- push ax ;sauvegarde des valeurs des registres ax,bx,cx et dx
- push bx
- push dx
- ;nbr 1 dans cx
- lea dx,_qn ;afficher le message _qn par l'interruption 9
- mov ah,9
- int 21h
- call scanInt ;saisir la valeur via la procedure scanInt
- call wrLn ;faire un retour ligne
- ;resultat
- lea dx,_r_puissance ;afficher le message _r_puissance
- mov ah,9
- int 21h
- mov ax,bx ;ecrire le contenu de bx dans ax
- mul ax ;mul bx ->> dx:ax = ax * ax
- call printInt ;affichage du resultat
- mov dx,ax ;le resultat est stocker par la suite dans ax pour pouvoir l'afficher
- call printInt ;afficher le resultat sur l'ecran
- call wrLn
- pop dx ;recuperer dx,bx et ax
- pop bx
- pop ax
- ret
- prog_puissance endp
- prog proc near
- assume cs:code,ds:donnee,ss:pile,es:nothing
- ; initialisation
- mov ax,donnee ;initialiser le segment de donnee
- mov ds,ax
- ;affichage de l'entete
- mov ah,9
- lea dx,_title_1
- int 21h
- lea dx,_title_2
- int 21h
- lea dx,_title_3
- int 21h
- lea dx,_title_4
- int 21h
- lea dx,_title_5
- int 21h
- lea dx,_title_6
- int 21h
- _p_menu:;afichage du menu
- mov ah,9
- lea dx,_menu
- int 21h
- ;choix
- mov ah,1
- int 21h
- call wrLn
- ;test selection
- _p_addition:
- cmp al,'1'
- jne _p_soustraction
- call prog_addition
- jmp _p_repeat
- _p_soustraction:
- cmp al,'2'
- jne _p_multiplication
- call prog_soustraction
- jmp _p_repeat
- _p_multiplication:
- cmp al,'3'
- jne _p_division
- call prog_multiplication
- jmp _p_repeat
- _p_division:
- cmp al,'4'
- jne _p_pgcd
- call prog_division
- jmp _p_repeat
- _p_pgcd:
- cmp al,'5'
- jne _p_ppcm
- call prog_pgcd
- jmp _p_repeat
- _p_ppcm:
- cmp al,'6'
- jne _p_puissance
- call prog_ppcm
- jmp _p_repeat
- _p_puissance:
- cmp al,'7'
- jne _p_menu
- call prog_puissance
- jmp _p_repeat
- _p_repeat:
- mov ah,9
- lea dx, _quit
- int 21h
- ;saisi du reponse
- mov ah,1
- int 21h
- call wrLn
- ;traitement
- cmp al,'n'
- je _p_menu
- cmp al,'y'
- jne _p_repeat
- _p_end:
- mov ax,4c00h
- int 21h
- prog endp
- code ends
- end prog
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement