Advertisement
Guest User

Untitled

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