Advertisement
Guest User

Untitled

a guest
May 27th, 2016
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.04 KB | None | 0 0
  1. # Nikola Rebraca
  2.  
  3. # Y*RESX/8 + X/8
  4.  
  5. .section .data
  6. RESX = 80 # horizontalna rezolucija, mora biti deljiva sa 8
  7. RESY = 25 # vertikalna rezolucija
  8. bitmap: .fill RESX*RESY/8,1,0 # video memorija
  9. printnew: .ascii "\n\n\n\n\0" # pomoćni stringovi za iscrtavanje video memorije
  10. printdot: .ascii "#\0"
  11. printspc: .ascii ".\0"
  12. printx: .ascii " X1=\0" # dodatni string za ispis ispod bitmape
  13. printx_len = .-printx
  14.  
  15. printy: .ascii " Y1=\0"
  16. printy_len = .-printy
  17.  
  18. str_x: .fill 5, 1, 0
  19. x_len = 5
  20. str_y: .fill 5, 1, 0
  21. y_len = 5
  22.  
  23. x: .long 1
  24. y: .long 1
  25.  
  26. smerx: .long 1
  27. smery: .long 1
  28.  
  29. max_x: .long RESX-1
  30. max_y: .long RESY-1
  31.  
  32. pomeraj: .long 0
  33.  
  34. # konstanta za generisanje pauze prilikom iscrtavanja, treba je prilagoditi
  35. # sopstvenom računaru, ukoliko je animacija previše brza ili spora
  36. PAUZA = 0x10000000
  37.  
  38. .section .text
  39. .globl main
  40.  
  41. main:
  42. #orb $0x80, bitmap+RESX*RESY/8/3 # iscrtavanje tačke na sredini ekrana
  43.  
  44. # glavna petlja programa
  45.  
  46. #postavljanje okvira
  47. okvir_gore:
  48. movl $bitmap, %ecx
  49. movb $255, %bl
  50. movl $RESX/8, %edx
  51. ok_g:
  52. cmpl $0, %edx
  53. je okvir_dole
  54. movb %bl, (%ecx)
  55. decl %edx
  56. incl %ecx
  57. jmp ok_g
  58. okvir_dole:
  59. movl $bitmap, %ecx
  60. addl $8*30, %ecx
  61. movl $RESX/8, %edx
  62. ok_d:
  63. cmpl $0, %edx
  64. je okvir_levo
  65. movb %bl, (%ecx)
  66. decl %edx
  67. incl %ecx
  68. jmp ok_d
  69. okvir_levo:
  70. movl $bitmap, %ecx
  71. movb $128, %bl
  72. movl %ecx, %edx
  73. addl $8*30, %edx
  74. ok_l:
  75. addl $10, %ecx
  76. cmpl %edx, %ecx
  77. je okvir_desno
  78. movb %bl, (%ecx)
  79. jmp ok_l
  80. okvir_desno:
  81. movl $bitmap, %ecx
  82. addl $9, %ecx
  83. movb $1, %bl
  84. movl %ecx, %edx
  85. addl $8*30, %edx
  86. ok_de:
  87. addl $10, %ecx
  88. cmpl %edx, %ecx
  89. je koory
  90. movb %bl, (%ecx)
  91. jmp ok_de
  92.  
  93. koory:
  94. movl smery, %eax
  95. cmpl $0, %eax
  96. jle negaty
  97.  
  98. movl y, %eax
  99. incl %eax
  100. incl %eax
  101. cmpl max_y, %eax #da li je stigao do kraja dole?
  102. je dno
  103.  
  104. incl y
  105. jmp koorx
  106. negaty:
  107. movl y, %eax
  108. decl %eax
  109. decl %eax
  110. cmpl $0, %eax #da li je stigao do kraja gore?
  111. je vrh
  112. decl y
  113. jmp koorx
  114. dno:
  115. negl smery
  116. incl y
  117. jmp koorx
  118. vrh:
  119. negl smery
  120. decl y
  121. jmp koorx
  122.  
  123. koorx:
  124. movl smerx, %eax
  125. cmpl $0, %eax
  126. jle negatx
  127.  
  128. movl x, %eax
  129. incl %eax
  130. incl %eax
  131. cmpl max_x, %eax #da li je stigao do kraja desno?
  132. je desno
  133. incl x
  134.  
  135. jmp petljica
  136. negatx:
  137. movl x, %eax
  138. decl %eax
  139. decl %eax
  140. cmpl $0, %eax #da li je stigao do kraja levo?
  141. je levo
  142. decl x
  143. jmp petljica
  144. desno:
  145. negl smerx
  146. incl x
  147. jmp petljica
  148. levo:
  149. negl smerx
  150. decl x
  151. jmp petljica
  152.  
  153. #namestanje odgovarajuceg bita za stampanje
  154. petljica:
  155. movl $8, %edi
  156. movb $1, %bl
  157. movl x, %eax
  158. xorl %edx, %edx
  159. divl %edi
  160.  
  161. cmpl $7, %edx #maska za ostatak 7 je 0x01
  162. je maska
  163.  
  164. rorb $1, %bl #maska za ostatak 0 je 0x10
  165. stelovanje:
  166. cmpl $0, %edx
  167. je maska
  168.  
  169. rorb $1, %bl
  170.  
  171. decl %edx
  172.  
  173. jmp stelovanje
  174. #cuva okvir sa strane
  175. maska:
  176. movl $8, %edi
  177. cmpl x, %edi
  178. jg mask
  179. movl $71, %esi
  180. cmpl x, %esi
  181. jl mas
  182. jmp petlja
  183. mas:
  184. orb $1, %bl
  185. jmp petlja
  186. mask:
  187. orb $0x80, %bl
  188.  
  189. #namestanje odgovarajuceg bajta za stampanje
  190. petlja:
  191. movl $RESX, %eax
  192. mull y
  193. movl $8, %edi
  194. divl %edi
  195. movl %eax, pomeraj
  196.  
  197. movl x, %eax
  198. divl %edi
  199. addl %eax, pomeraj
  200.  
  201. movl $bitmap, %ecx
  202. addl pomeraj, %ecx
  203.  
  204. movb %bl, (%ecx) #postavi tacku za stampanje
  205.  
  206. pushl %ecx
  207.  
  208. call printbitmap # iscrtavanje bitmape
  209.  
  210. pushl $str_x
  211. pushl x
  212. call broj_u_string
  213. addl $8, %esp
  214.  
  215. movl $4, %eax # ispis poruke
  216. movl $1, %ebx
  217. movl $printx, %ecx
  218. movl $printx_len, %edx
  219. int $0x80
  220.  
  221. movl $4, %eax
  222. movl $1, %ebx
  223. movl $str_x, %ecx
  224. movl $x_len, %edx
  225. int $0x80
  226.  
  227. pushl $str_y
  228. pushl y
  229. call broj_u_string
  230. addl $8, %esp
  231.  
  232. movl $4, %eax
  233. movl $1, %ebx
  234. movl $printy, %ecx
  235. movl $printy_len, %edx
  236. int $0x80
  237.  
  238. movl $4, %eax
  239. movl $1, %ebx
  240. movl $str_y, %ecx
  241. movl $y_len, %edx
  242. int $0x80
  243.  
  244. #brisanje prethodno odstampane tacke
  245.  
  246. popl %ecx
  247. brisi:
  248. movb $0, %bl
  249.  
  250. movl $8, %edi
  251. cmpl x, %edi
  252. jg obr
  253. movl $71, %esi
  254. cmpl x, %esi
  255. jl br
  256. jmp obrisi
  257. br:
  258. orb $0x01, %bl
  259. jmp obrisi
  260. obr:
  261. orb $0x80, %bl
  262. obrisi:
  263. andb %bl, (%ecx)
  264.  
  265. # na kraju glavne petlje programa se pravi pauza
  266. # kako bi uzastopna iscrtavanja ekrana dala animaciju
  267. movl $PAUZA, %eax
  268.  
  269. pauza:
  270. decl %eax
  271. jnz pauza
  272. jmp koory # izlaz iz programa je CTRL+C !!!
  273.  
  274. movl $1, %eax
  275. movl $0, %ebx
  276. int $0x80
  277.  
  278. #void broj_u_string()
  279. #potprogram koji pretvara broj u string, heksadecimalni zapis
  280.  
  281. broj_u_string:
  282. pushl %ebp
  283. movl %esp, %ebp
  284. pushl %ebx
  285.  
  286. movl 12(%ebp), %ecx #adresa stringa
  287. movl 8(%ebp), %eax #broj
  288. xorl %edx, %edx
  289. movl $16, %ebx
  290.  
  291. movl $0, (%ecx)
  292.  
  293. cmpl $0, %eax
  294. jne konvert
  295.  
  296. movb $'0', %dl
  297. movb %dl, (%ecx)
  298. jmp kraj
  299. konvert:
  300. cmpl $0, %eax
  301. je na_kraj
  302. xorl %edx, %edx
  303. divl %ebx
  304. cmpl $10, %edx
  305. jge slovo
  306.  
  307. addb $'0', %dl
  308. movb %dl, (%ecx)
  309. incl %ecx
  310. jmp konvert
  311. slovo:
  312. addb $55, %dl
  313. movb %dl, (%ecx)
  314. incl %ecx
  315. jmp konvert
  316.  
  317. na_kraj:
  318. movl 12(%ebp), %ecx
  319. movl %ecx, %edx
  320. navig:
  321. cmpb $0, (%edx)
  322. je obrni
  323. incl %edx
  324. jmp navig
  325.  
  326. obrni:
  327. movb (%edx), %bl
  328. movb (%ecx), %bh
  329. movb %bh, (%edx)
  330. movb %bl, (%ecx)
  331.  
  332. cmpl %ecx, %edx
  333. jle kraj
  334. incl %ecx
  335. decl %edx
  336. jmp obrni
  337.  
  338. kraj:
  339. popl %ebx
  340. popl %ebp
  341. ret
  342.  
  343.  
  344. # void printbitmap()
  345. # Potprogram koji iscrtava trenutni izgled monohromatskog ekrana
  346. # Svaka uključena tačka se ispisuje kao karakter "printdot".
  347. printbitmap:
  348. pushl %ebp
  349. movl %esp, %ebp
  350. pushl %ebx
  351. pushl %esi
  352. pushl %edi
  353.  
  354. movl $RESX, %esi # brojač X koordinate
  355. movl $RESY, %edi # brojač Y koordinate
  356. movl $4, %eax # ispis 4 newline-a
  357. movl $1, %ebx
  358. movl $printnew, %ecx
  359. movl $4, %edx
  360. int $0x80
  361.  
  362. movl $bitmap, %edx # pokazivač za prolazak kroz bitmapu
  363.  
  364. print_petlja1:
  365. movb (%edx), %bl # 8 tačaka za ispis
  366. movb $8, %bh # brojač tačaka
  367.  
  368. print_petlja2:
  369. movl $printspc, %ecx
  370. shlb $1, %bl # da li se ispisuje tačka ili praznina?
  371. jnc print_ispis
  372. movl $printdot, %ecx
  373. print_ispis:
  374. pushl %edx # ispis tačke ili praznine
  375. pushl %ebx
  376. movl $4, %eax
  377. movl $1, %ebx
  378. movl $1, %edx
  379. int $0x80
  380. popl %ebx
  381. popl %edx
  382.  
  383. decb %bh # da li je ispisano 8 tačaka?
  384. jnz print_petlja2
  385. incl %edx # prelazak na sledećih 8 tačaka
  386. subl $8, %esi # da li je ispisan ceo red?
  387. jnz print_petlja1
  388.  
  389. movl $RESX, %esi # priprema brojača X koordinate za ispis sledećeg reda
  390. pushl %edx # ispis jednog newline-a
  391. pushl %ebx
  392. movl $4, %eax
  393. movl $1, %ebx
  394. movl $printnew, %ecx
  395. movl $1, %edx
  396. int $0x80
  397. popl %ebx
  398. popl %edx
  399.  
  400. decl %edi # da li su ispisani svi redovi?
  401. jnz print_petlja1
  402.  
  403. popl %edi # vraćanje sačuvanih registara i završetak
  404. popl %esi
  405. popl %ebx
  406. movl %ebp, %esp
  407. popl %ebp
  408. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement