Advertisement
Guest User

Untitled

a guest
May 4th, 2019
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. pile segment para stack 'pile'
  2.         dw 512 dup(00)
  3. pile  ends
  4.  
  5.  
  6. donnee segment
  7.     _title_1        db  ' _____________________________________',10,'$'
  8.     _title_2        db  '|                                     |',10,'$'
  9.     _title_3        db  '|                                     |',10,'$'
  10.     _title_4        db  '|Made by :    Wissem Boujarra         |',10,'$'
  11.     _title_5        db  '|                                     |',10,'$'
  12.     _title_6        db  '|_____________________________________|',10,'$'
  13.     _menu           db  ' 1:(+) 2:(-) 3:(x) 4:(/) ',10,' taper le numero de votre operation: $'
  14.    
  15.     _qn1            db  '   n1 = $'
  16.     _qn2            db  '   n2 = $'
  17.     _qn             db  '   n= $'
  18.     _r_add          db  '   n1 + n2 = $'
  19.     _r_sub          db  '   n1 - n2 = $'
  20.     _r_mul          db  '   n1 x n2 = $'
  21.     _r_div          db  '   n1 / n2 = $'
  22.     _r_pgcd         db  '   PGCD(n1,n2) = $'
  23.     _r_ppcm         db  '   PPCM(n1,n2) = $'
  24.     _r_puissance    db  '   (x^2)= $'
  25.    
  26.     _quit           db  '  > quitter (y/n)? $'
  27.     _ascii          db  '0123456789ABCDEF'
  28. donnee ends
  29.  
  30. code segment
  31.    
  32.     wrLn proc near
  33.         push ax
  34.         push dx
  35.         mov dl,10
  36.         mov ah,2
  37.         int 21h
  38.         pop dx
  39.         pop ax
  40.         ret
  41.     wrLn endp
  42.  
  43.     ;scanHex resultat dans AL
  44.     ;si touche = entree -> F0h
  45.     ;sinon la valeur du touche
  46.     scanHex proc near
  47.         assume cs:code,ds:donnee,ss:pile
  48.        
  49.         _sh_getch: ;definir l'etiquette
  50.             mov ah,8 ;utlisation de l'interruption 8 pour l'acquisition d'un caractere sans echo
  51.             int 21h
  52.         ; entree ?
  53.             cmp al,13 ;comparer al ? la valeur du retour chariot
  54.             jne _sh_num             ;al!=13 -> test numerique
  55.             ;sinon al=13
  56.             mov al,0F0h ;al prend la valeur 0f0h
  57.             jmp _sh_out             ;sortie du fct
  58.            
  59.         _sh_num: ;definir l'etiquette _sh_num
  60.             cmp al,'0' ;comparer al au code ascii de 0
  61.             jb  _sh_getch           ;al<0 -> resaisie
  62.             ;al>=0                  
  63.             cmp al,'9' ;comparer al au code ascii de 9
  64.             ja  _sh_alpha_maj       ;al>9 -> test majuscul
  65.             ;sinon al ? 0..9
  66.             sub al,'0'              ;al <- al - '0'
  67.             jmp _sh_out             ;sortie du fct      
  68.            
  69.         _sh_alpha_maj: ;definir l'etiquette _sh_alpha_maj
  70.             cmp al,'A' ;comparer al au code ascii de A
  71.             jb  _sh_getch           ;al<A -> resaisie
  72.             ;al>=A                  
  73.             cmp al,'F' ;comparer al au code ascii de F
  74.             ja  _sh_alpha           ;al>F -> test minuscul
  75.             ;sinon al ? A..F
  76.             sub al,'A'-10           ;al <- al + 10 - 'A'
  77.             jmp _sh_out             ;sortie du fct  
  78.        
  79.         _sh_alpha: ;definir l'etiquette _sh_alpha
  80.             cmp al,'a' ;comparer al au code ascii de a
  81.             jb  _sh_getch           ;al<a -> resaisie
  82.             ;al>=a                  
  83.             cmp al,'f' ;comparer al au code ascii de f
  84.             ja  _sh_getch           ;al>f -> resaisie
  85.             ;sinon al ? a..f
  86.             sub al,'a'-10           ;al <- al + 10 - 'a'
  87.             jmp _sh_out             ;sortie du fct  
  88.            
  89.         _sh_out:
  90.             ret
  91.     scanHex endp
  92.    
  93.     ;resultat dans BX
  94.     ;fait apel a scanHex qui utilise AX
  95.     scanInt proc near
  96.         push    ax  ;sauvegarder les registres ax cx et bx dans la pile
  97.         push    cx
  98.         push    dx
  99.            
  100.             mov bx,0 ;initialiser le registre bx ? 0
  101.             mov ch,4 ;mettre la partie haute du registre cx ? 4
  102.         _si_scanHex: ;definir les instructions de l'etiquette _si_scanHex
  103.             call    scanHex ; appeler la procedure scanHex
  104.             cmp al,0F0h  ;comparer la partie basses du regitres ax a la valeur qui defini le retour chariot
  105.             je _si_out   ;si la condition precedente est realise on effectue l'etiquette _si_out
  106.             ;ajout de al dans bx
  107.             mov cl,4 ;la partie basses du registre prend la valeur 4
  108.             sal bx,cl;on effectue un decalage ? gauche de 4 bits
  109.             add bl,al ;on addiitone la valeur decale ? bl
  110.             ;affichage du lettre correspondante
  111.             push    bx ;on sauvegrade le registre bx
  112.             lea     bx,_ascii ;bx pointe le debut du tableau _ascii
  113.             xlat ;assure la conversion ascii hexad?cimale
  114.             mov     dl,al ;utiliser l-interruption 2 pour l'affichage d'un seul caractere
  115.             mov     ah,2  
  116.             int     21h    
  117.             pop bx ;recuperer la valeur de bx dej? stocker
  118.             ;codition du loop
  119.             dec ch ;ch=ch-1
  120.             cmp ch,0 ;comparer ch ? 0
  121.             jne _si_scanHex ;c'est la condition n'est pas egale on exeute l'etiquette _si_scanHex
  122.        
  123.         _si_out: ;definir l'etiquette  _si_scanout
  124.             pop dx ;recuperer les valeurs des registres dx,cx et ax
  125.             pop cx
  126.             pop ax
  127.             ret
  128.     scanInt endp
  129.    
  130.     ;entree dans DX
  131.     printInt proc near
  132.             push ax ;sauvegarder le contenue des registres ax,bx,cx,dx
  133.             push bx
  134.             push cx
  135.             push dx
  136.             push dx
  137.        
  138.             lea bx,_ascii ;bx point sur le debut du tableau _ascii
  139.             mov ch,0 ;affecter 0 pour la partuie haute du registre cx
  140.        
  141.         _pi_print_byte:;definir l'etiquette _pi_print__byte
  142.             mov al,dh  ;on ecrit dans al la valeur de ch
  143.             mov cl,4   ; on definit dans cl le nombre de bits ? decaler
  144.             shr al,cl ;onfait un decalage a droite par le nombre de cl
  145.             xlat      ;realise la conversion hexadecimale ascii
  146.                 mov dl,al ;utliser l'interuption 2 pour l'affichage d'un seul caractere
  147.                 mov ah,2  
  148.                 int 21h
  149.             mov al,dh
  150.             and al,0fh
  151.             xlat
  152.                 mov dl,al
  153.                 mov ah,2
  154.                 int 21h
  155.            
  156.             cmp ch,0
  157.             jnz _pi_fin
  158.            
  159.             pop dx
  160.             mov dh,dl
  161.             inc ch
  162.             jmp _pi_print_byte
  163.        
  164.         _pi_fin:
  165.             pop dx
  166.             pop cx
  167.             pop bx
  168.             pop ax
  169.             ret
  170.     printInt endp
  171.    
  172.     prog_addition proc near
  173.         push ax ;sauvegarder les valeurs des  registres ax,bx,cx et dx dans la pile
  174.         push bx
  175.         push cx
  176.         push dx
  177.  
  178.         ;nbr 1 dans cx
  179.         lea dx,_qn1  ;utiliser l'interruption 9 pour afficher le message_qn1
  180.         mov ah,9
  181.         int 21h
  182.         call scanInt ;faire appel a la fonction scanInt
  183.         mov cx,bx    ;?crire la valeur de sortie de scanInt dans bx
  184.         call wrLn    ;appel ? la fonction retoutr ligne
  185.  
  186.         ;nbr 2 dans bx
  187.         lea dx,_qn2  ;utiliser l'interruption 9 pour afficher le message _qn2
  188.         mov ah,9
  189.         int 21h
  190.         call scanInt  ;appeler la fonction scanInt qui lit les vombres entres par le clavier
  191.         call wrLn     ;faire retour a la ligne par la fonction wrln
  192.  
  193.         ;resultat
  194.         lea dx,_r_add  ;afficher le message de la r?sultat d'addtion par l'interuption 9
  195.         mov ah,9
  196.         int 21h
  197.        
  198.         mov dx,0  ;intialiser le registre dx ? 0    
  199.         add cx,bx ;faire de nombres d?ja saisie par le clavier par la commande add
  200.         adc dx,0  ;ajouter le carry
  201.         call printInt ;appel la fonction printInt pour afficher la resultat
  202.         mov dx,cx     ;
  203.         call printInt ;faire a la fonction  printInt pour afficher le r?sultat
  204.         call wrLn
  205.        
  206.         pop dx ;recuperer les valeures des registres dx,cx,bx et ax
  207.         pop cx
  208.         pop bx
  209.         pop ax
  210.         ret
  211.     prog_addition endp
  212.    
  213.     prog_soustraction proc near
  214.         push ax  ;sauvegarder les valeurs des registres ax,bx,cx et dx
  215.         push bx
  216.         push cx
  217.         push dx
  218.        
  219.         ;nbr 1 dans cx
  220.             lea dx,_qn1 ;faire appel a l'interruption 9 pour afficher le message _qn1
  221.             mov ah,9
  222.             int 21h
  223.             call scanInt ;appeler la fonction sacnInt pourt le premier valeur
  224.             mov cx,bx    ;stocker le valeur saisie dans le registre cx
  225.             call wrLn    ;faire appel a la fonction retour ligne
  226.            
  227.         ;nbr 2 dans bx
  228.             lea dx,_qn2 ;utiliser l'interruption 9 pour afficher le message _qn2
  229.             mov ah,9
  230.             int 21h
  231.             call scanInt ;utliser la proc?dure scanInt pour la deuxieme valeur
  232.             call wrLn    ;faire un retour a la ligne
  233.            
  234.         ;resultat
  235.             lea dx,_r_sub ;afficher du message _r_sub
  236.             mov ah,9
  237.             int 21h
  238.             mov dx,0   ;initialiser le registre dx a 0
  239.             sub cx,bx  ;soustraire bx de cx le resultat est dans cx
  240.             jns _ps_jumpOver
  241.         ;resultat negatif
  242.             mov dl,'-' ;afficher un seul caractere  par l'interruption 2
  243.             mov ah,2  
  244.             int 21h
  245.             neg cx
  246.         _ps_jumpOver:
  247.             mov dx,cx ;tsoxker le contenu de cx dans dx pour pouvoir l'afficher
  248.             call printInt
  249.             call wrLn
  250.        
  251.         pop dx ;recuperer de la pile le contenue de dx,cx,bx et ax
  252.         pop cx
  253.         pop bx
  254.         pop ax
  255.         ret
  256.     prog_soustraction endp
  257.        
  258.     prog_multiplication proc near
  259.         ;mul source ->>  dx:ax = ax * source
  260.         push ax ;sauvegarde des valeurs des registres ax,bx,cx et dx
  261.         push bx
  262.         push cx
  263.         push dx
  264.        
  265.         ;nbr 1 dans cx
  266.             lea dx,_qn1 ;afficher du premier message de saisie via la fonction 9
  267.             mov ah,9
  268.             int 21h
  269.             call scanInt ;saisir la valeur via la procedure scanInt
  270.             mov cx,bx    ;memoriser la valeur saisie dans cx
  271.             call wrLn    ;faire un retour ligne
  272.         ;nbr 2 dans bx
  273.             lea dx,_qn2 ;afficher le message pour la deuxieme saisie
  274.             mov ah,9
  275.             int 21h
  276.             call scanInt ;permet la lecture de la valeur saisie
  277.             call wrLn    ;faire un retour ligne
  278.         ;resultat
  279.             lea dx,_r_mul ;afficher le message _r_mul
  280.             mov ah,9
  281.             int 21h
  282.             mov ax,cx ;ecrire le contenu de cx dans ax
  283.             mul bx    ;mul bx ->>  dx:ax = ax * bx
  284.             call printInt ;affichage du resultat
  285.             mov dx,ax ;le resultat est stocker par la suite dans ax pour povoir l'afficher  
  286.             call printInt
  287.             call wrLn
  288.        
  289.         pop dx ;recuperer dx,cx,bx et ax
  290.         pop cx
  291.         pop bx
  292.         pop ax
  293.         ret
  294.     prog_multiplication endp
  295.    
  296.    
  297.     prog_division proc near
  298.         ;DIV SRC ->> DX:AX / SRC >> q = AX , r = DX
  299.         push ax ;sauvegarde ax,bx,cx et dx
  300.         push bx
  301.         push cx
  302.         push dx
  303.        
  304.         ;nbr 1 dans cx
  305.             lea dx,_qn1 ;afficher le premier message _qn1
  306.             mov ah,9
  307.             int 21h
  308.             call scanInt ;saisie le premier valeur
  309.             mov cx,bx    ;sauvegarder la valeur saisie dans cx
  310.             call wrLn    ;faire un retour a la ligne
  311.         ;nbr 2 dans bx
  312.             lea dx,_qn2 ;saisie le deuxieme valeur
  313.             mov ah,9
  314.             int 21h
  315.             call scanInt
  316.             call wrLn
  317.         ;resultat
  318.             lea dx,_r_div ;afficher le message _r_div par l'interruption 9
  319.             mov ah,9
  320.             int 21h
  321.            
  322.             mov dx,0  ;initaliser dx
  323.             mov ax,cx ;ecrire cx dans ax
  324.             div bx ;DIV bx ->> DX:AX / bx >> q = AX , r = DX
  325.             mov dx,ax ;stocker le resulatt dans dx
  326.             call printInt ;afficher le resultat sur ecran
  327.             call wrLn     ;retour ligne
  328.        
  329.         pop dx  ;recuperer les valeur de dx,cx,bx et ax
  330.         pop cx
  331.         pop bx
  332.         pop ax
  333.         ret
  334.     prog_division endp
  335.    
  336.     pgcd proc near
  337.             push ax ;sauvegarde le contenu ax,bx et cx
  338.             push bx
  339.             push cx
  340.         _pgcd_cmp:
  341.             cmp bx,cx ;comparer bx et cx
  342.             je _pgcd_end ;sauter a l'etiquette
  343.             cmp bx,cx    ;comparer bx a cx
  344.             ja _pgcd_over ;si bx>cx faire un saut a _pgcd_over
  345.             sub cx,bx     ;cx=cx-bx
  346.             jmp _pgcd_cmp
  347.         _pgcd_over:
  348.             sub bx,cx ;bx=bx-cx
  349.             jmp _pgcd_cmp
  350.            
  351.         _pgcd_end:
  352.             mov dx,bx ;le resultat est dans dx
  353.            
  354.             pop cx ;recuperer cx,bx et ax
  355.             pop bx
  356.             pop ax
  357.             ret
  358.     pgcd endp
  359.    
  360.     prog_pgcd proc near
  361.         push ax ;sauvegarde ax,bx,cx et dx
  362.         push bx
  363.         push cx
  364.         push dx
  365.        
  366.         ;nbr 1 dans cx
  367.             lea dx,_qn1 ;afficher le message: n1=
  368.             mov ah,9
  369.             int 21h
  370.             call scanInt ;lire la valeur saisie
  371.             mov cx,bx    ;la mettre dans cx
  372.             call wrLn    ;faire un retour ligne
  373.         ;nbr 2 dans bx
  374.             lea dx,_qn2 ;afficher le message:n2=
  375.             mov ah,9
  376.             int 21h
  377.             call scanInt ;lire la valeur saisie
  378.             call wrLn    ;appel a la procedure retour ligne
  379.         ;resultat
  380.             lea dx,_r_pgcd ;afficher le message _r_pgcd
  381.             mov ah,9
  382.             int 21h
  383.            
  384.             call pgcd ; dx = pgcd(cx,bx)
  385.             call printInt ;afficher la valeur du pgcd
  386.             call wrLn
  387.        
  388.         pop dx ;recuperer les valeurs de dx,cx et bx
  389.         pop cx
  390.         pop bx
  391.         pop ax
  392.         ret
  393.     prog_pgcd endp
  394.    
  395.     prog_ppcm proc near
  396.         push ax ;sauvegarde des registres ax,bx,cx et dx dans la pile
  397.         push bx
  398.         push cx
  399.         push dx
  400.        
  401.         ;nbr 1 dans cx
  402.             lea dx,_qn1 ;afficher le premier message _qn1
  403.             mov ah,9
  404.             int 21h
  405.             call scanInt ;lire la valeur saisie par l'utlisateur
  406.             mov cx,bx    ;la stocker dans cx
  407.             call wrLn    ;un retour a la ligne par wrln
  408.         ;nbr 2 dans bx
  409.             lea dx,_qn2  ;lire la deixieme valeur saisie
  410.             mov ah,9
  411.             int 21h
  412.             call scanInt ;lire la valeur
  413.             call wrLn    ;faire un retour a la ligne
  414.         ;resultat
  415.             lea dx,_r_ppcm ;afficher le messge _r_pgcd
  416.             mov ah,9
  417.             int 21h
  418.            
  419.             call pgcd ; dx = pgcd(cx,bx)
  420.             mov ax,bx ;ecrire le contenu de bx dans ax
  421.             mov bx,dx ; bx = pgcd
  422.             mul cx ; dx:ax = ax * cx
  423.             div bx  ;faire la division (ax*vx)/bx
  424.            
  425.             mov dx,ax ;ecrire ax dans dx
  426.             call printInt ;afficher la valeur de ppcm
  427.             call wrLn ;faire un retour ligne
  428.        
  429.         pop dx ;recuperer le contenu de dx,cx,bx et ax par le directive pop
  430.         pop cx
  431.         pop bx
  432.         pop ax
  433.         ret
  434.     prog_ppcm endp
  435.     prog_puissance proc near
  436.         push ax ;sauvegarde des valeurs des registres ax,bx,cx et dx
  437.         push bx
  438.         push dx
  439.        
  440.         ;nbr 1 dans cx
  441.             lea dx,_qn ;afficher le message _qn par l'interruption 9
  442.             mov ah,9
  443.             int 21h
  444.             call scanInt ;saisir la valeur via la procedure scanInt
  445.             call wrLn    ;faire un retour ligne
  446.             ;resultat
  447.             lea dx,_r_puissance ;afficher le message _r_puissance
  448.             mov ah,9
  449.             int 21h
  450.             mov ax,bx ;ecrire le contenu de bx dans ax
  451.             mul ax    ;mul bx ->>  dx:ax = ax * ax
  452.             call printInt ;affichage du resultat
  453.             mov dx,ax ;le resultat est stocker par la suite dans ax pour pouvoir l'afficher  
  454.             call printInt ;afficher le resultat sur l'ecran
  455.             call wrLn
  456.        
  457.         pop dx ;recuperer dx,bx et ax
  458.         pop bx
  459.         pop ax
  460.         ret
  461.     prog_puissance endp
  462.    
  463.    
  464.     prog proc near
  465.         assume cs:code,ds:donnee,ss:pile,es:nothing
  466.         ; initialisation
  467.             mov ax,donnee ;initialiser le segment de donnee
  468.             mov ds,ax
  469.            
  470.             ;affichage de l'entete
  471.                 mov ah,9
  472.                 lea dx,_title_1
  473.                 int 21h
  474.                 lea dx,_title_2
  475.                 int 21h
  476.                 lea dx,_title_3
  477.                 int 21h
  478.                 lea dx,_title_4
  479.                 int 21h
  480.                 lea dx,_title_5
  481.                 int 21h
  482.                 lea dx,_title_6
  483.                 int 21h
  484.            
  485.         _p_menu:;afichage du menu          
  486.                 mov ah,9
  487.                 lea dx,_menu
  488.                 int 21h
  489.             ;choix
  490.                 mov ah,1
  491.                 int 21h
  492.                 call wrLn
  493.             ;test selection
  494.         _p_addition:
  495.                 cmp al,'1'
  496.                 jne _p_soustraction
  497.                 call prog_addition
  498.                 jmp _p_repeat
  499.         _p_soustraction:
  500.                 cmp al,'2'
  501.                 jne _p_multiplication
  502.                 call prog_soustraction
  503.                 jmp _p_repeat
  504.         _p_multiplication:
  505.                 cmp al,'3'
  506.                 jne _p_division
  507.                 call prog_multiplication
  508.                 jmp _p_repeat
  509.         _p_division:
  510.                 cmp al,'4'
  511.                 jne _p_pgcd
  512.                 call prog_division
  513.                 jmp _p_repeat
  514.         _p_pgcd:
  515.                 cmp al,'5'
  516.                 jne _p_ppcm
  517.                 call prog_pgcd
  518.                 jmp _p_repeat
  519.         _p_ppcm:
  520.                 cmp al,'6'
  521.                 jne _p_puissance
  522.                 call prog_ppcm
  523.                 jmp _p_repeat
  524.                
  525.         _p_puissance:
  526.                 cmp al,'7'
  527.                 jne _p_menu
  528.                 call prog_puissance
  529.                 jmp _p_repeat  
  530.         _p_repeat:
  531.             mov ah,9
  532.             lea dx, _quit
  533.             int 21h
  534.             ;saisi du reponse
  535.             mov ah,1
  536.             int 21h
  537.             call wrLn
  538.             ;traitement
  539.             cmp al,'n'
  540.             je _p_menu
  541.             cmp al,'y'
  542.             jne _p_repeat
  543.        
  544.         _p_end:
  545.             mov ax,4c00h
  546.             int 21h
  547.     prog  endp
  548. code ends
  549. end  prog
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement