Advertisement
Guest User

Untitled

a guest
Mar 26th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. .model tiny
  2. .stack 80h
  3.  
  4.  
  5. .data
  6. zero db ' ### $', ' # # $', '# #$', '# #$', '# #$', ' # # $', ' ### $'
  7. one db ' # $', ' ## $', ' # # $', ' # $', ' # $', ' # $', ' ##### $'
  8. erroor db 'Wprowadzono niepoprawna liczbe $'
  9. new_line db 13,10, '$'
  10. .code
  11.  
  12.  
  13. start:
  14. ;przeniesienie segmentu danych do ds
  15. mov ax, seg zero
  16. mov ds,ax
  17. ;wczytanie z klawiatury cyfry w hex
  18. mov ah,8
  19. int 21h
  20.  
  21. ;oszacowanie z jakiego przedziału jest wprowadzona liczba,
  22. ;poprzez porownanie granicznych wartości kodu ASCII
  23.  
  24. cmp al, '0'
  25. jl errooor ;jesli mniejsza od 0 to skacze do etykiety errooor
  26.  
  27. cmp al, '9'
  28. jle convert_number ;jesli z zakresu 0-9 skacze do convert_number
  29.  
  30. ;duze litery w kodzie ASCII sa przed malymi, wiec trzeba je najpierw sprawdzic
  31. cmp al, 'F'
  32. jle convert_capital_letter ;jesli jest z przedziału 10-15 to skacze do convert_capital_letter
  33.  
  34. cmp al, 'a' ;jesli liczba z przedzialu G-... to blad
  35. jl errooor
  36.  
  37. cmp al, 'f'
  38. jle convert_lower_case_letter ;jesli jest z przedziału 10-15 to skacze do convert_lower_case_letter
  39.  
  40.  
  41. jmp errooor ; jesli nie sa z przedzialu 0-15 to skacze do errooor
  42.  
  43.  
  44.  
  45. errooor:
  46. ;wypisanie bledu na ekran
  47. lea dx, erroor
  48. mov ah,9
  49. int 21h
  50. jmp the_end
  51.  
  52.  
  53.  
  54. convert_number:
  55. ;zamiana liczby z kodu ascii na jej wartość
  56. sub al, '0'
  57. jmp continue
  58.  
  59.  
  60.  
  61. convert_lower_case_letter:
  62. ;zamiana małej litery
  63. sub al, 'a'
  64. add al, 10 ;A=11, jak odejmiemy al=al-kod ascii a to otrzymamy wynik z przedzialu 0-5, a szukamy 10-15
  65. jmp continue
  66.  
  67.  
  68.  
  69. convert_capital_letter:
  70. ;zamiana dużej litery
  71. sub al, 'A'
  72. add al, 10 ;a=11, jak odejmiemy al=al-kod ascii a to otrzymamy wynik z przedzialu 0-5, a szukamy 10-15
  73.  
  74.  
  75. continue:
  76. mov cx,7 ;licznik petli zewnetrznej, petla loop inkrementuje
  77. mov bx,0 ;rejestr odpowiedzialny za wypisanie kolejnych wierszy
  78.  
  79.  
  80. write_banner:
  81. push cx
  82. push ax ; tworzymy kopie naszej liczby (al), odstawiajac ją na stos
  83. mov cl,3 ;licznik potrzebny do przesuniecia bitowego w prawo
  84.  
  85.  
  86.  
  87. ;sprawdza na kolejnych bitach czy znajduje sie 0,czy 1
  88. check3rdbit:
  89. and ax,0000000000001000b ;maska dla 3 bitu
  90. shr al,cl ;przesuwam al o 3 bity w prawo
  91. cmp al,1
  92. je write_one ;jesli 1 to wypisuje 1
  93. jl write_zero ;w przeciwnym razie wypisuje 0
  94.  
  95.  
  96. check2ndbit:
  97. and ax,0000000000000100b ;maska dla 2 bitu
  98. shr al,cl ;przesuwam al o 2 bity w prawo
  99. cmp al,1
  100. je write_one
  101. jl write_zero
  102.  
  103.  
  104. check1stbit:
  105. and ax,0000000000000010b ;maska dla 1 bitu
  106. shr al,cl ;przesuwam al o 1 bit w prawo
  107. cmp al,1
  108. je write_one ;jesli 1 to wypisuje 1
  109. jl write_zero
  110.  
  111.  
  112. check0bit:
  113. and ax,0000000000000001b ;maska dla 0 bitu
  114. cmp al,1
  115. je write_one1 ;jesli 1 to wypisuje 1
  116. lea dx,zero
  117. add dx,bx
  118. mov ah,9
  119. int 21h
  120.  
  121.  
  122. continue1:
  123. lea dx, new_line ;przeskakuje do wypisywania nowej lini w banerze
  124. mov ah,9
  125. int 21h
  126. add bx,8
  127. pop ax
  128. pop cx
  129. loop write_banner ;powtarza 7 razy, dla kazdej linijki
  130. jmp the_end
  131.  
  132.  
  133. write_one:
  134. lea dx, one
  135. add dx,bx
  136. mov ah,9
  137. int 21h
  138. pop ax
  139. push ax
  140. dec cl
  141. cmp cl,1
  142. jg check2ndbit
  143. je check1stbit
  144. jl check0bit
  145.  
  146. write_one1:
  147. lea dx, one
  148. add dx,bx
  149. mov ah,9
  150. int 21h
  151. jmp continue1
  152.  
  153.  
  154. write_zero:
  155. lea dx,zero
  156. add dx,bx ;odpowiedzialny za przeskoczenie do nastepnego fragmentu tekstu, zaraz po $
  157. mov ah,9
  158. int 21h
  159. pop ax
  160. push ax
  161. dec cl
  162. cmp cl,1
  163. jg check2ndbit
  164. je check1stbit
  165. jl check0bit
  166.  
  167.  
  168. the_end:
  169. mov ah,4ch
  170. int 21h
  171.  
  172. end start
  173. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement