Advertisement
Guest User

Untitled

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