Advertisement
Guest User

Untitled

a guest
Apr 7th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.                 .MODEL      SMALL
  2.  
  3. Kod             SEGMENT
  4.                 ORG         100h
  5.                 ASSUME      CS:Kod, DS:Kod, SS:Kod
  6.  
  7. Start:          jmp         Start2
  8.                
  9. Napis1          DB          "0$00000000000000", "$"
  10. Napis2          DB          "0$00000000000000", "$"
  11. NapisWynik      DB          "0$00000000000000", "$"
  12. Liczba1         DW          ?
  13. Liczba2         DW          ?
  14. Wynik           DW          ?
  15. Endl            DB          13, 10, "$"
  16. s_Podaj1        DB          "Podaj pierwsza liczbe: ", "$"
  17. s_Podaj2        DB          "Podaj druga liczbe:    ", "$"
  18. s_Wynik         DB          "Wynik dodawania: ", "$"
  19. s_Blad          DB          "Przekroczono zakres!", "$"
  20. s_Poczatek      DB          "Program dodaje dwie liczby z zakresu [-32768...32767]!", "$"
  21.  
  22. ReadChar        MACRO
  23.                 mov         ah, 08h
  24.                 int         21h
  25.                 ENDM
  26.  
  27. PrintChar       MACRO       Char
  28.                 mov         dl, Char
  29.                 mov         ah, 02h
  30.                 int         21h
  31.                 ENDM
  32.  
  33. PrintString     MACRO       String
  34.                 mov         dx, OFFSET String
  35.                 mov         ah, 09h
  36.                 int         21h
  37.                 ENDM               
  38.                
  39. Start2:    
  40.                 PrintString s_Poczatek
  41.                 PrintString Endl
  42.            
  43. Poczatek:              
  44.                 PrintString s_Podaj1
  45.                
  46.                 ;           pobierz pierwsza liczbe
  47.                 mov         si, OFFSET Napis1
  48.                 call        ReadNum
  49.                
  50.                 PrintString Endl
  51.                
  52.                 ;           przygotuj pierwsza liczbe 16-bitowa
  53.                 mov         si, OFFSET Napis1
  54.                 call        StrToNum
  55.                 mov         Liczba1, ax
  56.                
  57.                 PrintString s_Podaj2
  58.                
  59.                 ;           pobierz druga liczbe
  60.                 mov         si, OFFSET Napis2
  61.                 call        ReadNum
  62.                
  63.                 PrintString Endl
  64.        
  65.                 ;           przygotuj druga liczbe 16-bitowa
  66.                 mov         si, OFFSET Napis2
  67.                 call        StrToNum
  68.                 mov         Liczba2, ax
  69.                
  70.                 ;           przygotuj wynik dodawania 32-bitowy
  71.                 mov         ax, Liczba1
  72.                 mov         bx, Liczba2
  73.                 call        SumNum
  74.  
  75.                 ;           przygotuj wynik jako ciag znakow
  76.                 mov         si, OFFSET NapisWynik
  77.                 call        NumToStr
  78.                
  79.                 PrintString s_Wynik
  80.                 PrintString NapisWynik
  81.                
  82.                 jmp         Koniec
  83. Blad:
  84.                 PrintString s_Blad
  85.                 PrintString Endl
  86.                 jmp         Poczatek
  87. Koniec:
  88.                 mov         ax, 4C00h
  89.                 int         21h
  90.  
  91. ;               +++         Read Number        
  92. ReadNum:
  93.                 mov         cx, 0
  94.                 mov         dx, 0
  95. ReadNum_Czytaj:
  96.                 ReadChar                            ; wczytaj znak
  97.                 cmp         al, 13                 
  98.                 je          ReadNum_Return          ; jesli enter to przejdz na koniec
  99.                 cmp         al, 45
  100.                 je          ReadNum_Minus
  101.                 cmp         al, '0'
  102.                 jb          ReadNum_Czytaj          ; jesli mniejsze od '0' to przejdz na koniec
  103.                 cmp         al, '9'
  104.                 ja          ReadNum_Czytaj          ; jesli wieksze od '9' to przejdz na koniec
  105.                 mov         dl, al
  106.                 PrintChar   al                      ; wyswietl ten znak
  107.                 mov         [si], dx
  108.                 inc         si
  109.                 mov         cx, 1
  110.                 jmp         ReadNum_Czytaj
  111. ReadNum_Minus:
  112.                 cmp         cx, 1
  113.                 je          ReadNum_Czytaj
  114.                 mov         cx, 1
  115.                 mov         byte PTR [si], "-"
  116.                 inc         si
  117.                 PrintChar   "-"
  118.                 jmp         ReadNum_Czytaj
  119.                
  120. ReadNum_Return:
  121.                 mov         byte PTR [si], "$"
  122.                 ret
  123. ;               ---         Read Number
  124.    
  125. ;               +++         String To Number
  126. StrToNum:
  127.                 push        si
  128.                 mov         ax, 0
  129.                 mov         bx, 0
  130.                 mov         cx, 10                  ; podstawa
  131. StrToNum_Petla:        
  132.                 mov         bl, [si]                ; czytaj znak
  133.                 inc         si
  134.                 cmp         bl, 24h                
  135.                 je          StrToNum_Koniec         ; jesli '$' to koniec
  136.                 cmp         bl, "-"
  137.                 je          StrToNum_Petla
  138.                 sub         bl, '0'                 ; odejmij kod znaku '0'
  139.                 mul         cx                      ; pomnoz przez podstawe
  140.                 jc          StrToNum_Zakres
  141.                 jo          StrToNum_Zakres
  142.                 add         ax, bx                  ; dodaj
  143.                 jc          StrToNum_Zakres
  144.                 jo          StrToNum_Zakres
  145.                 jmp         StrToNum_Petla
  146. StrToNum_Ujemna:
  147.                 neg         ax
  148.                 jmp         StrToNum_Return
  149. StrToNum_Zakres:
  150.                 mov         ax, 0
  151.                 pop         si
  152.                 jmp         Blad
  153. StrToNum_Koniec:
  154.                 pop         si
  155.                 mov         bl, [si]
  156.                 cmp         bl, "-"
  157.                 je          StrToNum_Ujemna
  158. StrToNum_Return:
  159.                 ret
  160. ;               ---         String To Number
  161.  
  162. ;               +++         Sum Numbers
  163. SumNum:    
  164.                 mov         dx, 0
  165.                 add         ax, bx                  ; dodaj liczby
  166.                 jo          SumNum_Po               ; jesli flaga przepelnienia to skocz
  167.                 mov         bx, 0
  168.                 cmp         bx, ax                  ; jesli liczba jest wieksza od 0 to nie rob nic
  169.                 jle         SumNum_Return
  170.                 mov         dx, 0FFFFh              ; jesli mniejsza to wstaw jedynki na pierwszych 16 bitach (ujemna)
  171.                 jmp         SumNum_Return
  172. SumNum_Po:     
  173.                 jc          SumNum_Pc               ; jesli flaga przeniesienia to skocz
  174.                 jmp         SumNum_Return           ; jesli nie to nic nie rob
  175. SumNum_Pc:     
  176.                 mov         dx, 0FFFFh              ; wstaw jedynki na 16 pierwszych bitach (ujemna)
  177.                 jmp         SumNum_Return
  178. SumNum_Return:
  179.                 ret
  180. ;               ---         Sum Numbers
  181.  
  182. ;               +++         Number To String
  183. NumToStr:
  184.                 mov         cx, 0
  185.                 cmp         dx, 8000h
  186.                 jae         NumToStr_Minus
  187. NumToStr_Petla1:           
  188.                 cmp         ax, 0
  189.                 je          NumToStr_Petla2
  190.                 mov         bx, 10                  ; podstawa
  191.                 div         bx                      ; dziel
  192.                 push        dx                      ; reszte daj na stos
  193.                 mov         dx, 0
  194.                 inc         cx
  195.                 jmp         NumToStr_Petla1
  196. NumToStr_Petla2:
  197.                 cmp         cx, 0
  198.                 je          NumToStr_Return
  199.                 pop         dx                      ; zdejmij ze stosu
  200.                 add         dx, '0'                 ; dodaj kod znaku '0'
  201.                 mov         [si], dx                ; wpisz znak
  202.                 inc         si
  203.                 loop        NumToStr_Petla2
  204.                 mov         byte PTR [si], '$'      ; na koniec wpisz '$'
  205.                 jmp         NumToStr_Return
  206. NumToStr_Minus:
  207.                 mov         byte PTR [si], '-'
  208.                 inc         si
  209.                 neg         ax
  210.                 mov         dx, 0
  211.                 jmp         NumToStr_Petla1
  212. NumToStr_Return:
  213.                 ret
  214. ;               ---         Number To String
  215.  
  216. Kod             ENDS               
  217.  
  218.                 END         Start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement