Advertisement
Guest User

Untitled

a guest
May 6th, 2015
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. ;Zadanie 13
  2. ;Napisać program, który pobiera z wejścia dwa łańcuchy znakowe,
  3. ;a następnie sprawdza, czy zawierają tą samą liczbę liter,
  4. ;wypisyjąc na ekran stosowny komunikat.
  5. ;Program powinien móc wielokrotnie powtarzać operację z różnymi ciągami
  6. ;znaków oraz zakończyć pracę po wciśnięciu przez użytkownika klawisza [ENTER].
  7. ;Wykorzystać procedury i stos. Aplikacja ma być idiotoodporna!!!!!!
  8.  
  9. ;Ważne:
  10. ;1. Może wprowadzić wszystko.
  11. ;2. Sprawdza tylko litery
  12.  
  13. org 100h
  14.  
  15. %define bufSize 20
  16.  
  17. section .text
  18.  
  19. Start:
  20.  
  21.  
  22. ;=================================Procedury=================================
  23.  
  24. menu:
  25. mov dx, iMenu
  26. call wyswietlIQ
  27.  
  28. call pralka
  29.  
  30.  
  31. ret
  32.  
  33. pralka:
  34. call nowaLinia
  35. mov dx,qPierwszy
  36. call wyswietlIQ
  37.  
  38. mov dx,firstBuf
  39. call wczytajCiag
  40.  
  41. call nowaLinia
  42. mov bx,[firstBuf.text]
  43.  
  44. call iloscZnakow
  45.  
  46. mov dl,[jakaszmienna]
  47. mov ah,2
  48. int 21h
  49. ;mov [tempBuf],bx
  50. ;mov dx,tempBuf.text
  51. ;call wyswietlIQ
  52. ;call nowaLinia
  53. ;mov dx, firstBuf.text
  54. ;call wyswietlIQ
  55.  
  56. call czyKoniec
  57.  
  58. iloscZnakow:
  59. pusha ;wrzuca wszystkie rejestry na stos
  60.  
  61. mov bx,0 ;w bx będzie nasza ilość liter w ciągu znaków
  62. mov di,2 ;do indeksowania
  63. mov cl,[firstBuf+1] ;w cl mamy ile znaków jest w buforze, będzie to licznik pętli p
  64.  
  65. p:
  66. mov dl,[firstBuf+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
  67. cmp dl,65 ;sprawdzamy, czy di+1 element jest większy/równy niż 65
  68. jge costam ;65 w ASCII to "A". Sprawdzamy po prostu, czy to nie jest jakiś dziwny znak przed "A"
  69.  
  70. poczymstam: ;to jest po to, żeby można było do czegoś skoczyć po sprawdzeniu, czy di+1 element jest literą
  71. inc di ;zwiększamy di, żeby sprawdzić następny element
  72. dec cl ;zmniejszamy licznik pętli
  73. cmp cl,0 ;porównujemy cl do 0
  74. jg p ;jeśli cl większe to robi wszystko od nowa
  75.  
  76. ;tutaj już czynią się rzeczy po skończeniu pętli. W bx jest ilość liter w ciągu
  77. mov [jakaszmienna],bx ;przenosimy zawartość bx do jakiejś zmiennej - bx zostanie nadpisane po popa
  78. popa ;z powrotem wyrzucamy wszystkie stosy
  79. ret
  80.  
  81.  
  82. costam: ;cośtam ma dalej sprawdzać, czy di+1 element jest liczbą
  83. cmp dl,90
  84. jle cos ;jeśli di+1 element jest "Z" (90 w ASCII to "Z"), to idziemy do czegoś
  85.  
  86. 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"
  87. jge cosinnego ;jeśli to jest coś po "a" lub to jest to "a", to wszystko idzie do czegoś innego
  88.  
  89. jmp poczymstam ;jeśli to nie jest żadna litera, to po prostu wracamy. Jeśli wygodniej, to można użyć ret'a
  90.  
  91. cos: ;coś ma po prostu zwiększyć bx, w którym siedzi ta liczba liter w ciągu
  92. inc bx ;zwiększamy bx
  93. jmp poczymstam ;wracamy. Może być też ret
  94.  
  95. cosinnego: ;jeśli program doszedł do tego momentu, to oznacza, że di+1 element jest czymś po "a"
  96. 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")
  97. 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ś)
  98.  
  99. jmp poczymstam ;jeśli to nie jest mała litera, tylko coś po niej, to wracamy
  100.  
  101.  
  102. cosjeszczeinnego: ;patrz: coś
  103. inc bx
  104. jmp poczymstam
  105.  
  106.  
  107. 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ć
  108.  
  109. czyKoniec:
  110. call nowaLinia
  111. mov dx,qKoniec
  112. call wyswietlIQ
  113.  
  114. call wczytajZnak
  115. cmp al,13
  116. je koniec
  117. jne pralka
  118.  
  119. wczytajCiag:
  120. mov ah, 0ah
  121. int 21h
  122. ret
  123.  
  124. wczytajZnak:
  125. mov ah, 1
  126. int 21h
  127. ret
  128.  
  129. wyswietlIQ:
  130. mov ah,9
  131. int 21h
  132. ret
  133.  
  134. nowaLinia:
  135. mov ah,02
  136. mov dl,0ah
  137. int 21h
  138. ret
  139.  
  140. koniec:
  141. mov ax, 4C00h
  142. int 21h
  143.  
  144.  
  145. ;===========================================================================
  146. section .data
  147. ;=================================Informacje================================
  148. iMenu db "Program porownuje ilosc liter w podanych przez uzytkownika ciagach znakow.",0ah,0dh,"Maksymalna dlugosc ciagu to 20 znakow.$"
  149. ;===========================================================================
  150.  
  151. ;=================================Pytania===================================
  152. qPierwszy db "Podaj pierwszy ciag znakow: $"
  153. qDrugi db "Podaj drugi ciag znakow: $"
  154. qKoniec db "Czy chcesz porownac kolejne dwa ciagi znakow?",0ah,0dh,"TAK - Enter/Nie - cokolwiek.$"
  155. ;===========================================================================
  156.  
  157. ;=================================Bufory====================================
  158. firstBuf:
  159. .wartosc: db bufSize
  160. .ilosc: db 0
  161. .text: times bufSize+1 db "$"
  162.  
  163. secondBuf:
  164. db bufSize
  165. .ilosc: db 0
  166. .text: times bufSize+1 db "$"
  167.  
  168. tempBuf:
  169. db bufSize
  170. .ilosc: db 0
  171. .text: times bufSize+1 db "$"
  172.  
  173. ;===========================================================================
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement