Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2019
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Progr segment
  2.  
  3. assume  cs:Progr,ds:dane,ss:stosik
  4.  
  5. readln proc;
  6. mov ah,0ah ;funkcja wczytujaca z klawiatury
  7. int 21h
  8. ret
  9. endp
  10.  
  11. writeln proc
  12. mov ah,09h ;funkcja wypisujaca na ekran
  13. int 21h
  14. ret
  15. endp
  16.  
  17. isNull proc
  18. lea dx,msg1
  19. call writeln
  20. jmp koniec
  21. ret
  22. endp
  23.  
  24. wrongNumber proc
  25. lea dx,msg2
  26. call writeln
  27. jmp koniec
  28. ret
  29. endp
  30.  
  31. toBigNumber proc
  32. lea dx,msg3
  33. call writeln
  34. jmp koniec
  35. ret
  36. endp
  37.  
  38. Start: 
  39.     mov ax,dane
  40.     mov ds,ax
  41.     mov ax,stosik
  42.     mov ss,ax
  43.     lea sp,szczyt
  44.  
  45.     lea dx,msg
  46.     call writeln
  47.  
  48.     lea dx,dlBufora
  49.     call readln
  50. ;Wczytywanie liczby----------------------------------------------------------------------
  51. ;sprawdzenie czy ciag znakow nie jest pusty, nastepnie kolejne znaki przenosimy do bl
  52. ;w sumie na poczatku jest 0 , ale potem beda tam liczby i mnozymy je razy 10 , nastepnie sprawdzamy
  53. ;czy doszlo do przepelnienia potem odejmujemy od znaku znak 0 i sprawdzamy wynik czy jest on w zakresie 0-9
  54. ;jesli jest to znaczy ze to byla cyfra i dodajemy ja do sumy, zwiekszamy si , a nastepnie wykonujemy kolejna iteracje
  55. ;----------------------------------------------------------------------------------------------------
  56.    
  57.     CMP ile,0; sprawdzenie czy podany ciag znakow nie jest pusty, jesli tak to wywolac procedure isNull, jezeli nie skocz do etykiety dalej
  58.     jnz  dalej
  59.     call isNull
  60. dalej:
  61.     mov si,0; index 0
  62. czyliczba:
  63.     mov bl,znaki(si); przenies pierwszy znak do rejestru bl
  64.     cmp bl,13; prownuje znak znak z kodem 13 klawisza enter jesli enter to skacz do etykiety koniecLiczby
  65.     jz koniecLiczby
  66.     mov ax,suma ; kopiuj sume do rejestru ax => ax:=suma
  67.     mul dycha; ax:=ax*dycha, czyli * 10 => ax:=ax*10
  68.     jno notOverflow; jezeli brak przepelnienia do skocz do etykiety notOverflow
  69.     call toBigNumber; wywolaj procedure za duza liczba
  70. notOverflow:
  71.     mov suma,ax ; suma:=ax
  72.     sub bl,'0'; bl:=bl-'0'
  73.     mov cyfra,bl; cyfra:=bl
  74.     cmp cyfra,10; jezeli cyfra = lub >10 to wywolaj procedure wrongNumber, jezli 10> to jest liczba i skocz do etykiety isNumber
  75.     jc isNumber
  76.     call wrongNumber
  77. isNumber:
  78.     mov bl,cyfra; bl:=cyfra
  79.     add suma,bx ; suma:=suma+bx
  80.     jnc notOverflow1; jezeli brak przepelnienia to skocz do etykiety notOverflow1
  81.     call toBigNumber; wywolaj procedure toBigNumber
  82. notOverflow1:
  83.     inc si; zwieksz rejestr indeksowy o 1 -> si:=si+1
  84.     cmp si,6; jezli index rowny 6 to idz do etykiety koniecLiczby, jezeli jest mniejszy to skocz do etykiety czyliczba i sprawdzaj kolejne znaki
  85.     jnz czyliczba  
  86. koniecLiczby:
  87.  
  88. ; zamiana z 10 na 2 --------------------------------------------------------------------
  89. ;Zamiana liczby w systemie 10 (wynik) na system 2
  90. ;Aby wypisac liczbe w postaci binarnej przesuwamy ja o jedno miejsce
  91. ;i sprawdzamy znacznik przeniesienia CF.
  92. ;Liczba znajduje sie w rejestrze AX, SI jest to pozycja znaku
  93. ;w lancuchu ktora nalezy zmodyfikowac i jednoczesnie licznikiem petli.
  94. ;Liczba moze byc zapisana maksymalnie na 16 bitach (0-15) wiec wykonujemy 16 iteracji
  95. ;petli.
  96. ;========================================================================================
  97.  
  98.     mov ax,suma ;
  99.     mov si,0
  100. binary:
  101.     rol ax,1; przesun wartosc AX w lewo => AX*2
  102.     jc jedynka; jesli nastapilo przeniesienie skocz do etykiety
  103.     jnc zero; jesli nie bylo przeniesienia skocz do etykiety
  104. dalejBinary:
  105.     mov liczba2(si),dl
  106.     cmp si,15; porownaj si z 15 (maksymalny numer bitu w rejestrze 16-bitowym )
  107.     je koniecBinary; jesli SI=15 to skocz do etykiety
  108.     inc si; zwieksz SI o 1
  109.     jmp binary;
  110. jedynka:
  111.     mov dl,31h; kod znaku "1"
  112.     jmp dalejBinary;
  113. zero:
  114.     mov dl,30h; kod znaku "0"
  115.     jmp dalejBinary;
  116. koniecBinary:
  117.     mov liczba2(16),'$'
  118.            
  119. ; zamiana z 10 na 16 ------------------------------------------------------------------
  120. ;zamiana z systemu 10 na 16
  121. ; w tym bloku kodu programu rejestr CL pelni role licznika przesuniecia
  122. ;logicznego wartosci liczby, rejestr CH jest ogolnym licznikiem petli
  123. ;natomiast si jest wskazaniem pozycji w lancuchu tekstu ktory ma byc zmieniony
  124. ;przygotowanie rejestrow
  125. ;=======================================================================================
  126.  
  127.     xor cl,cl; zerowanie przesuniecia logicznego
  128.     mov ch,3; ustaw licznik na 3
  129.     mov si,3; ustaw index na 3
  130. hexa:
  131.     mov ax,suma;
  132.     ror ax,cl; przesuniecie rejestru ax o cl miejsc w prawo =>AX:=AX/(2^CL)
  133.     and ax,1111b; maska 4 bitów
  134.     cmp al,9; porownanie liczby z 9
  135.     ja litery; jesli liczba > 9 to skocz do etykiety litery
  136.     add al,30h; w przeciwnym wypadku do liczby dodaj kod ASCII znaku '0'
  137. dalejHexa:
  138.     mov liczba16(si),al; przekazanie znaku do zmiennej lancuchowej
  139.     cmp ch,0; porownaj licznik z 0
  140.     je koniecHexa; jesli licznik = 0 to wyjdz z petli
  141.     dec si; si:=si-1;
  142.     dec ch; zmniejsz licznik o 1;
  143.     add cl,4; zwieksz wartosc przesuniecia 0 4
  144.     jmp hexa; nastepna iteracja
  145. litery:
  146.     sub al,10; od liczby odejmnij 10;
  147.     add al,'A'; do liczby dodaj kod ASCII znaku 'A'
  148.     jmp dalejHexa; skocz do etykiety
  149. koniecHexa:
  150.     mov liczba16(4),'H' ; przekazanie znaku do zmiennej lancuchowej
  151.     mov liczba16(5),'$' ; przekazanie znaku do zmiennej lancuchowej
  152.  
  153. ; wypiswanie liczby 10, 2, 16 ---------------------------------------------------------
  154.     mov al,dlBufora
  155.     mov ah,0
  156.     mov si,ax
  157.     mov znaki(5),'$'
  158.     lea dx,msg4
  159.     call writeln
  160.     lea dx,znaki(0)
  161.     call writeln   
  162.     lea dx,msg5
  163.     call writeln
  164.     lea dx,liczba2(0)
  165.     call writeln   
  166.     lea dx,msg6
  167.     call writeln
  168.     lea dx,liczba16(0)
  169.     call writeln
  170.    
  171. koniec:
  172.     lea dx, msg7
  173.     call writeln
  174.     lea dx,dlBufora
  175.     call readln
  176.     mov ah,4Ch
  177.     mov al,0h
  178.     int 21h
  179.  
  180. Progr ends
  181.  
  182.  
  183. dane segment
  184.  
  185. dlBufora db 6 ;ile znakow wczytca
  186. ile db 0    ;ile zostalo wczytanych
  187. znaki db 6 dup (0) ;miejsce na znaki
  188. dycha dw 10
  189. cyfra db 0
  190. suma dw 0
  191. liczba2 db 17 dup(0)
  192. liczba16 db 6 dup(0)
  193.  
  194. msg db 'Prosze podac liczbe z zakresu od 0 do 65535',10,13,'$'
  195. msg1 db 10,13,'Nic nie zostalo wpisane','$'
  196. msg2 db 'Zle wpisana liczba',10,13,'$'
  197. msg3 db 10,13,'Liczba jest z poza zakresu','$'
  198. msg4 db 10,13,'   Liczba dziesietnie: $'
  199. msg5 db 10,13,'   Liczba binarnie: $'
  200. msg6 db 10,13,'   Liczba hexadecymalnie: $'
  201. msg7 db 10,13,'Aby zakonczyc program wcisnij enter $'
  202.  
  203. dane ends
  204.  
  205.  
  206. stosik segment
  207.  
  208.         dw 100h dup(0)
  209. szczyt  label word
  210.  
  211. stosik ends
  212. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement