Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. dane1    segment
  2.  
  3. zera     db       "   ###   $  #   #  $ #     # $ #     # $ #     # $  #   #  $   ###   $"
  4. jedynki  db       " ##### $   #   $   #   $   #   $ # #   $  ##   $   #   $"
  5. blad     db       "Wprowadzono nieprawidlowe dane!", '$'
  6. nowa_linia    db       10, 13, '$'
  7. buffer   db       02h, 00h
  8.          db       1 dup(?)          ; bufor
  9.          db       00h
  10.  
  11. dane1    ends
  12.  
  13. kod1     segment
  14.  
  15. start:
  16. ; pobranie napisu
  17. mov      ax, seg buffer
  18. mov      ds, ax
  19. mov      dx, offset buffer          ; ds:dx - bufor
  20. mov      bx, dx
  21. mov      ah, 0ah                    ; buffered input
  22. int      21h
  23.  
  24. ; przejscie do nowej linii
  25. mov      ax, seg nowa_linia
  26. mov      ds, ax
  27. mov      dx, offset nowa_linia
  28. mov      ah, 09h
  29. int      21h
  30.  
  31. ; doklejenie $ na koniec buforu
  32. xor      ax, ax
  33. mov      al, [bx + 1]               ; dlugosc wpisanego tekstu do buforu
  34. cmp      al, 0h                     ; jesli nie wprowadzono niczego to wyswietl blad
  35. je       wyswietl_blad
  36. mov      byte ptr [bx + 3], '$'     ; dodajemy na koniec buforu $
  37.                                                          
  38. ; przeniesienie wczytanej wartosci do al
  39. mov      byte ptr al, ds:[bx + 2]   ; w al mamy wartosc ASCII wpisanego znaku
  40.  
  41. cmp      al, 48                     ; jesli kod ASCII < 48
  42. jb       wyswietl_blad
  43. cmp      al, 58                     ; jesli jest cyfra
  44. jb       obsluz_cyfre
  45. cmp      al, 65                     ; jesli kod ASCII jest w przedziale [58; 70]
  46. jb       wyswietl_blad
  47. cmp      al, 71                     ; jesli jest duza litera
  48. jb       obsluz_duza
  49. cmp      al, 97
  50. jb       wyswietl_blad
  51. cmp      al, 103                    ; jesli jest duza litera
  52. jb       obsluz_mala
  53. jmp      wyswietl_blad              ; w innym wypadku
  54.  
  55. obsluz_cyfre:
  56. sub      al, 48
  57. jmp      wyswietl_baner
  58.  
  59. obsluz_duza:
  60. sub      al, 55
  61. jmp      wyswietl_baner
  62.  
  63. obsluz_mala:
  64. sub      al, 87
  65. jmp      wyswietl_baner
  66.  
  67. wyswietl_baner:
  68. xor      ah, ah                            ; zerujemy ah
  69. mov      cx, 4
  70. przesun_do_lewej:
  71. shl      al, 1                             ; przesuwa liczbe do lewej strony
  72. loop     przesun_do_lewej
  73.                            
  74. mov      cx, 7                             ; 7 iteracji wierszy
  75. wyswietl_wiersz:
  76. push     ax                                ; zachowujemy wczytana liczbe
  77. push     cx                                ; zachowujemy liczbe iteracji
  78. mov      cx, 4                             ; iteracje petli wewnetrznej
  79. wyswietl_cyfre:
  80. pop      bx                                ; zeby wiedziec po skoku ktory wiersz rysowac
  81. push     bx                                ; mamy cx dalej na stosie
  82. push     ax                                ; zachowujemy nasza liczbe
  83. and      al, 10000000b                     ; andujemy pierwszy bit
  84. cmp      al, 10000000b                     ; jeden czy zero?
  85. je       wyswietl_jeden
  86. jmp      wyswietl_zero
  87.  
  88. wyswietl_cyfre_powrot:
  89. pop      ax                                ; nasza liczba z powrotem
  90. shl      al, 1                             ; przesuwamy o 1 w lewo liczbe aby moc badac kolejny bit
  91. loop     wyswietl_cyfre                    ; kolejna cyfra do wypisania
  92.  
  93. mov      ax, seg nowa_linia                ; przechodzimy do nowego wiersza
  94. mov      ds, ax
  95. mov      dx, offset nowa_linia
  96. mov      ah, 09h
  97. int      21h
  98.  
  99. pop      cx                                ; bierzemy ilosc iteracji zewn petli do wykonania
  100. pop      ax                                ; wczytujemy pierwotna liczbe
  101.  
  102. loop     wyswietl_wiersz                   ; i lecimy kolejny poziom
  103. jmp      zakoncz
  104.  
  105.  
  106. wyswietl_zero:
  107. xor      ax, ax
  108. sub      bl, 1
  109. mov      al, bl
  110. mov      bl, 10
  111. mul      bl
  112. mov      bx, ax
  113. mov      ax, seg zera
  114. mov      ds, ax
  115. mov      dx, offset zera
  116. add      dx, bx
  117. mov      ah, 09h
  118. int      21h
  119. jmp      wyswietl_cyfre_powrot
  120.  
  121. wyswietl_jeden:
  122. xor      ax, ax
  123. sub      bl, 1
  124. mov      al, bl
  125. mov      bl, 8
  126. mul      bl
  127. mov      bx, ax
  128. mov      ax, seg jedynki
  129. mov      ds, ax
  130. mov      dx, offset jedynki
  131. add      dx, bx
  132. mov      ah, 09h
  133. int      21h
  134. jmp      wyswietl_cyfre_powrot
  135.  
  136. jmp      zakoncz
  137.  
  138. wyswietl_blad:
  139. mov      ax, seg blad
  140. mov      ds, ax
  141. mov      dx, offset blad
  142. mov      ah, 09h
  143. int      21h
  144. jmp      zakoncz
  145.  
  146. ; koniec programu
  147. zakoncz:
  148. mov      ah, 04ch
  149. int      21h
  150.  
  151. kod1     ends
  152.  
  153. stos1    segment STACK
  154. stos1    ends
  155.  
  156. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement