Advertisement
Guest User

Untitled

a guest
Apr 28th, 2015
215
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.43 KB | None | 0 0
  1. ORG 100H
  2. START:
  3.  
  4. call enter
  5.  
  6. mov ah,10
  7. mov dx,pierwszy
  8. int 21h ;wpisujemy sobie ciąg z klawiatury
  9.  
  10. mov bx,pierwszy
  11. mov bufor,bx ;ładujemy ciąg do bufora. Przed kolejnym użyciem iloscZnakow trzeba będzie wyczyścić bufor i przepisać do niego kolejny ciąg
  12.  
  13. call iloscZnakow
  14.  
  15. call enter
  16.  
  17. mov ah,2 ;wyświetla znak, którego kod ASCII jest w dl
  18. mov dl,[jakaszmienna] ;dl = ilość liter w ciągu znaków (nie w ASCII, trzeba dodać "0"/48 żeby się wyświetliło co trzeba)
  19. int 21h ;wyświetla dl
  20.  
  21. mov ax,4c00h
  22. int 21h
  23.  
  24.  
  25. iloscZnakow:
  26. pusha ;wrzuca wszystkie rejestry na stos
  27.  
  28. mov bx,0 ;w bx będzie nasza ilość liter w ciągu znaków
  29. mov di,2 ;do indeksowania
  30. mov cl,[bufor+1] ;w cl mamy ile znaków jest w buforze, będzie to licznik pętli p
  31.  
  32. p:
  33. mov dl,[bufor+di] ;do dl przenosimy di+1 element bufora - min. 2, bo 1 i 2 mają odpowiednio maksymalną długość ciągu i faktyczną długość ciągu
  34. cmp dl,65 ;sprawdzamy, czy di+1 element jest większy/równy niż 65
  35. jge costam ;65 w ASCII to "A". Sprawdzamy po prostu, czy to nie jest jakiś dziwny znak przed "A"
  36.  
  37. poczymstam: ;to jest po to, żeby można było do czegoś skoczyć po sprawdzeniu, czy di+1 element jest literą
  38. inc di ;zwiększamy di, żeby sprawdzić następny element
  39. dec cl ;zmniejszamy licznik pętli
  40. cmp cl,0 ;porównujemy cl do 0
  41. jg p ;jeśli cl większe to robi wszystko od nowa
  42.  
  43. ;tutaj już czynią się rzeczy po skończeniu pętli. W bx jest ilość liter w ciągu
  44. mov [jakaszmienna],bx ;przenosimy zawartość bx do jakiejś zmiennej - bx zostanie nadpisane po popa
  45. popa ;z powrotem wyrzucamy wszystkie stosy
  46. ret
  47.  
  48.  
  49. costam: ;cośtam ma dalej sprawdzać, czy di+1 element jest liczbą
  50. cmp dl,90
  51. jle cos ;jeśli di+1 element jest "Z" (90 w ASCII to "Z"), to idziemy do czegoś
  52.  
  53. cmp dl,97 ;jeśli di+1 element nie jest dużą literą, to zaczynamy sprawdzać. W tym celu sprawdzamy, czy jest to jakaś litera po "a"
  54. jge cosinnego ;jeśli to jest coś po "a" lub to jest to "a", to wszystko idzie do czegoś innego
  55.  
  56. jmp poczymstam ;jeśli to nie jest żadna litera, to po prostu wracamy. Jeśli wygodniej, to można użyć ret'a
  57.  
  58. cos: ;coś ma po prostu zwiększyć bx, w którym siedzi ta liczba liter w ciągu
  59. inc bx ;zwiększamy bx
  60. jmp poczymstam ;wracamy. Może być też ret
  61.  
  62. cosinnego: ;jeśli program doszedł do tego momentu, to oznacza, że di+1 element jest czymś po "a"
  63. cmp dl,122 ;sprawdzamy, czy di+1 element jest małą literą (122 to "z", więc patrzymy, czy dl jest czymś pomiędzy "a", a "z")
  64. jle cosjeszczeinnego ;jeśli jest, to idziemy do czegoś jeszcze innego (w sumie można było iść od razu do czegoś, ale lubię utrudniać ludziom życie, coś jeszcze innego działa identycznie jak coś)
  65.  
  66. jmp poczymstam ;jeśli to nie jest mała litera, tylko coś po niej, to wracamy
  67.  
  68.  
  69. cosjeszczeinnego: ;patrz: coś
  70. inc bx
  71. jmp poczymstam
  72.  
  73.  
  74. jakaszmienna db 0 ;w tej zmiennej przechowywana jest długość ciągu znaków (samych liter), trzeba sobie przenosić jej zawartość do różnych rejestrów przed kolejnymi użyciami procedury iloscZnakow, bo się będzie nadpisywać
  75.  
  76. pierwszy:
  77. db 20 ; def wielkość bufora na 20 bajtów
  78. db 0 ; ilość znaków w buforze
  79. .text: times 22 db "$"
  80.  
  81. bufor:
  82. db 20 ; def wielkość bufora na 20 bajtów
  83. db 0 ; ilość znaków w buforze
  84. .text: times 22 db "$"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement