Advertisement
Guest User

Untitled

a guest
Jan 13th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. org 100h    ;okreslenie stosu
  2.  
  3. start:  
  4.     ;zerujemy rejestry
  5.     xor     ax,ax
  6.     xor     dx,dx
  7.     xor     bx,bx
  8.     xor     cx,cx
  9.     xor     di,di
  10.    
  11.     mov     cx,3    ;   przyjmujemy maksymalnie 3 cyfrowa liczbe
  12.     jmp     Zmienna_A
  13.    
  14.    
  15. ;pobierz zmienna A 
  16. Zmienna_A:
  17.    
  18.     mov     ah,9
  19.     mov     dx,ent1 ; enter
  20.     int     21h
  21.    
  22.     mov     ah,9
  23.     mov     dx, wpZmien1 ; tekst wpisz zmienna A
  24.     int     21h
  25.     wpiszZmienna_A:
  26.     mov     ah,1    ;pobranie wartosci A           
  27.     int     21h
  28.    
  29.     jmp     sprZmienna_A   
  30.  
  31.     ;sprawdzamy czy zmienna  nie jest jakims znakiem specjalnym lub  enterem
  32.     sprZmienna_A:
  33.  
  34.         cmp     al, 13
  35.         je          koniecWpiszZmienna_A  ; jesli enter to konczymy pobierac nastepne liczby
  36.    
  37.         cmp     al,48  
  38.         jb          zlyZnak                     ; koniec programu
  39.  
  40.         cmp     al,57
  41.         ja          zlyZnak                     ; koniec programu
  42.    
  43.         mov     ah,0                            ; wypisanie na ekran
  44.    
  45.         sub     ax,48                       ; format z ASCI na liczbe (wartosc)
  46.    
  47.         push    ax                              ; wepchniecie wartosci na stos
  48.    
  49.         inc     di                              ; inkrementacja di ++
  50.    
  51.         loop        wpiszZmienna_A          ; petla cx > 0
  52.    
  53.    
  54.    
  55.         koniecWpiszZmienna_A:          
  56.             cmp     cx,3            ; jesli petla nie wykona sie ani razu, bo wprowadzilismy np enter, znaczy ze podano zly znak
  57.             je          zlyZnak
  58.    
  59.             xor     ax,ax       ; profilaktyczne zerowanie rejestrow
  60.             xor     dx,dx
  61.             xor     cx,cx
  62.             xor     bx,bx
  63.    
  64.             sciagnijZeStosu_A:  ; sciagamy wartosci ze stosu, aby uzyskac liczbę do obliczen
  65.                 sub     di,1        ; nasze di bylo rowne ilosci wykonywanych petel (ale potrzebujemy o jeden mniejszego)
  66.    
  67.                 mov     cx,di
  68.                 pop     ax
  69.    
  70.                 add     bx,ax   ; przechowuje nam tymczasowo nasza liczbe
  71.                 mov     dx,10   ; przekazanie wartosci 10 do dx
  72.            
  73.                 cmp     cx,0        ; jezeli di = cx = 0 to nie ma wiecej cyfr na stosie
  74.                 jle liczbaNaStos_A   ; wypychamy gotowa liczbe na stos
  75.    
  76.                 petlaDoStosu_A :    ; sciagamy kolejne cyfry ze stosu
  77.                 xor     ax,ax       ; profilaktyczne zerowanie rejestru
  78.    
  79.                 pop         ax
  80.                
  81.                 mul     dx              ; ax*dx
  82.    
  83.                 add     bx,ax
  84.    
  85.                 xor     ax,ax       ; profilaktyczne zerowanie rejestru
  86.                
  87.                 mov     ax,dx       ; przekazanie wartosci z dx -> ax
  88.    
  89.                 mul     dx              ; ax*dx
  90.                
  91.                 xor     dx,dx       ; profilaktyczne zerowanie rejestru
  92.                
  93.                 mov     dx,ax       ; przekazanie wartosci z ax -> dx
  94.    
  95.                 loop petlaDoStosu_A ; cx>0
  96.    
  97.    
  98.                 liczbaNaStos_A:    
  99.                 xor     ax,ax       ; profilaktyczne zerowanie rejestru
  100.                 mov     ax,bx       ; przepisanie zsumowanej liczby z bh do ax,
  101.                 push    ax              ; wypchniecie ax na stos jako liczba zminnej A
  102.                
  103.                 jmp wybierzDzialanie
  104.                 ;jmp        petla1
  105.                
  106.  
  107. ;--------------------------------
  108.  
  109.  
  110. ;pobierz zmienna B 
  111. Zmienna_B:
  112.    
  113.     mov     ah,9
  114.     mov     dx,ent1 ; enter
  115.     int     21h
  116.    
  117.     mov     ah,9
  118.     mov     dx, wpZmien2 ; tekst wpisz zmienna B
  119.     int     21h
  120.     wpiszZmienna_B:
  121.     mov     ah,1    ;pobranie wartosci B           
  122.     int     21h
  123.    
  124.     jmp     sprZmienna_B
  125.  
  126.     ;sprawdzamy czy zmienna  nie jest jakims znakiem specjalnym lub  enterem
  127.     sprZmienna_B:
  128.  
  129.         cmp     al, 13
  130.         je          koniecWpiszZmienna_B  ; jesli enter to konczymy pobierac nastepne liczby
  131.    
  132.         cmp     al,48  
  133.         jb          zlyZnak                     ; koniec programu
  134.  
  135.         cmp     al,57
  136.         ja          zlyZnak                     ; koniec programu
  137.    
  138.         mov     ah,0                            ; wypisanie na ekran
  139.    
  140.         sub     ax,48                       ; format z ASCI na liczbe (wartosc)
  141.    
  142.         push    ax                              ; wepchniecie wartosci na stos
  143.    
  144.         inc     di                              ; inkrementacja di ++
  145.    
  146.         loop        wpiszZmienna_B          ; petla cx > 0
  147.    
  148.    
  149.    
  150.         koniecWpiszZmienna_B:          
  151.             cmp     cx,3            ; jesli petla nie wykona sie ani razu, bo wprowadzilismy np enter, znaczy ze podano zly znak
  152.             je          zlyZnak
  153.    
  154.             xor     ax,ax       ; profilaktyczne zerowanie rejestrow
  155.             xor     dx,dx
  156.             xor     cx,cx
  157.             xor     bx,bx
  158.    
  159.             sciagnijZeStosu_B:  ; sciagamy wartosci ze stosu, aby uzyskac liczbę do obliczen
  160.                 sub     di,1        ; nasze di bylo rowne ilosci wykonywanych petel (ale potrzebujemy o jeden mniejszego)
  161.    
  162.                 mov     cx,di
  163.                 pop     ax
  164.    
  165.                 add     bx,ax   ; przechowuje nam tymczasowo nasza liczbe
  166.                 mov     dx,10
  167.            
  168.                 cmp     cx,0        ; jezeli di = cx = 0 to nie ma wiecej cyfr na stosie
  169.                 jle liczbaNaStos_B   ; wypychamy gotowa liczbe na stos
  170.    
  171.                 petlaDoStosu_B: ; sciagamy kolejne cyfry ze stosu
  172.                 xor     ax,ax       ; profilaktyczne zerowanie rejestru
  173.    
  174.                 pop         ax
  175.                 mul     dx              ; ax*dx
  176.    
  177.                 add     bx,ax
  178.    
  179.                 xor     ax,ax       ; profilaktyczne zerowanie rejestru
  180.                
  181.                 mov     ax,dx       ; przekazanie wartosci z dx -> ax
  182.    
  183.                 mul     dx              ; ax*dx
  184.                
  185.                 xor     dx,dx       ; profilaktyczne zerowanie rejestru
  186.                
  187.                 mov     dx,ax       ; przekazanie wartosci z ax -> dx
  188.    
  189.                 loop petlaDoStosu_B ; cx>0
  190.    
  191.    
  192.                 liczbaNaStos_B:    
  193.                 xor     ax,ax       ; profilaktyczne zerowanie rejestru
  194.                 mov     ax,bx       ; przepisanie zsumowanej liczby z bx do ax,
  195.                 ;push   ax              ; wypchniecie ax na stos jako liczba zminnej B    narazie nie pushujemy
  196.                
  197.                 ret
  198.        
  199. ;--------------------------------
  200.    
  201. wybierzDzialanie:
  202.     mov     ah,9
  203.     mov     dx, ent1
  204.     int     21h
  205.  
  206.     mov     ah,9
  207.     mov     dx, tekst      
  208.     int     21h
  209.    
  210.     mov     ah,1
  211.     int     21h
  212.    
  213.     mov     ah,0
  214.    
  215.     warunki:
  216.  
  217.         ; czy wprowadzono +
  218.         cmp     al,43  
  219.         je      dodawanie
  220.         ; czy wprowadzno -
  221.         cmp     al,45
  222.         je      odejmowanie
  223.         ; czy wprowadzona *
  224.         cmp     al,42  
  225.         je      mnozenie
  226.         ; czy wrowadzona /
  227.         cmp     al,47
  228.         je      dzielenie
  229.  
  230.         ; wprowadzono zly znak
  231.         jmp     zlyZnak
  232.    
  233.    
  234. ;--------------------------------
  235.    
  236. zlyZnak:
  237.     ;wprowadzono zly znak spoza operandow /,*,-,+   - zakancza program
  238.     mov     ah,9
  239.     mov     dx,ent1
  240.     int     21h
  241.    
  242.     mov     ah,9
  243.     mov     dx,blad
  244.     int     21h
  245.    
  246.     jmp     koniec
  247.  
  248. ;--------------------------------
  249.    
  250. ; etykieta konca programu
  251. koniec:
  252.     mov     ax,4C00h
  253.     int         21h
  254.  
  255. ;--------------------------------  
  256.    
  257. ; deklaracja zmiennych
  258. zmienne:
  259.     ent1      db    13,10,36
  260.     tekst     db    "Wybierz dostepne dzialanie arytmetyczne: ", 13,10, "+ : dodaj", 13,10, "- : odejmij",13,10, "* : pomnoz",13,10, "/ : podziel", 13,10,36
  261.     wpZmien1  db    "Podaj wartosc zmiennej A:",13,10,36
  262.     wpZmien2  db    "Podaj wartosc zmiennej B:",13,10,36
  263.     wpWynik   db    "Wynik wynosi: ", 13,10,36
  264.     blad      db    "Wprowadzono zly znak, nieodpowiadajacy wskazanym instrukcjom, zakanczam program",13,10,36
  265.  
  266.    
  267.    
  268. ;--------------------------------
  269.  
  270. ; etykieta dodawania
  271. dodawanie:
  272.     call        Zmienna_B
  273.     push    ax
  274.  
  275.     push    bp
  276.    
  277.     mov     bp,sp
  278.  
  279.     mov     ax,0
  280.     mov     ax,[bp+4]
  281.     mov     bx,[bp+2]
  282.     add     ax,bx
  283.  
  284.     pop     bp
  285.  
  286.     jmp     petla1
  287.  
  288. ;--------------------------------  
  289.    
  290. ; etykieta odejmowania
  291. odejmowanie:
  292.     call        Zmienna_B
  293.     push    ax
  294.  
  295.     push    bp
  296.    
  297.     mov     bp,sp
  298.  
  299.     mov     ax,0
  300.     mov     ax,[bp+4]
  301.     mov     bx,[bp+2]
  302.     sub     ax,bx
  303.  
  304.     pop     bp
  305.  
  306.     jmp     petla1
  307.  
  308.    
  309. ;--------------------------------  
  310.    
  311. ; etykieta mnozenia
  312. mnozenie:
  313.     call        Zmienna_B
  314.     push    ax
  315.  
  316.     push    bp
  317.    
  318.     mov     bp,sp
  319.  
  320.     mov     ax,0
  321.     mov     ax,[bp+4]
  322.     mov     bx,[bp+2]
  323.     mul     bl
  324.  
  325.     jmp     petla1
  326.  
  327.    
  328. ;--------------------------------  
  329.    
  330. ; etykieta dzielenia
  331. dzielenie:
  332.     call        Zmienna_B
  333.     push    ax
  334.  
  335.     push    bp
  336.    
  337.     mov     bp,sp
  338.  
  339.     mov     ax,0
  340.     mov     ax,[bp+4]
  341.     mov     bx,[bp+2]
  342.     div     bl
  343.  
  344.     pop     bp
  345.  
  346.     jmp     petla1
  347.  
  348.  
  349. ;--------------------------------  
  350.    
  351. ; etykieta wypisania wyniku obliczen na ekran
  352. wypisz:    
  353.     mov     ah,9
  354.     mov     dx,ent1
  355.     int     21h
  356.  
  357.     mov     ah,9
  358.     mov     dx,wpWynik
  359.     int     21h
  360.  
  361.     jmp     petla2
  362.  
  363. ; etykieta petli uzywanej do podzielenia wyniku na pojedyncze cyfry i wrzucenia na stos
  364. petla1:
  365.     cmp     ax, 0
  366.  
  367.     je          wypisz
  368.  
  369.     xor     dx,dx
  370.  
  371.     mov     bx,10
  372.     div     bx
  373.  
  374.     push    dx
  375.  
  376.     inc     cx
  377.  
  378.     jmp     petla1
  379.  
  380.    
  381. ; etykieta petli uzywanej do wypisania wyniku ze stosu pojedynczymi cyframi
  382. petla2:
  383.     xor     dx,dx
  384.  
  385.     pop     dx
  386.    
  387.     mov     ax,dx
  388.    
  389.     add     ax,48
  390.    
  391.     mov     ah,2
  392.     mov     dx,ax
  393.     int         21h
  394.  
  395.     loop        petla2
  396.    
  397.     jmp     koniec
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement