Advertisement
Guest User

Untitled

a guest
Nov 12th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.58 KB | None | 0 0
  1. ;***************************************************************
  2. ; Programa atidaranti failą duom.txt, pakeičianti mažąsias raides didžiosiomis ir rezultatą įrašanti į failą rez.txt
  3. ;***************************************************************
  4. .model small
  5. skBufDydis EQU 100 ;konstanta skBufDydis (lygi 20) - skaitymo buferio dydis
  6. skBufDydis2 EQU 100
  7. raBufDydis EQU 101 ;konstanta raBufDydis (lygi 20) - rašymo buferio dydis
  8. raBufDydis2 EQU 101
  9. .stack 100h
  10. .data
  11. ;duom db "duom.txt",0 ;duomenų failo pavadinimas, pasibaigiantis nuliniu simboliu (C sintakse - '\0')
  12. ;duom2 db "duom2.txt",0
  13. ;rez db "rez.txt",0 ;rezultatų failo pavadinimas, pasibaigiantis nuliniu simboliu
  14. skBuf db skBufDydis dup (0) ;skaitymo buferis
  15. skBuf2 db skBufDydis2 dup (0)
  16. raBuf db raBufDydis dup (30h) ;rašymo buferis
  17. raBuf2 db raBufDydis2 dup (0)
  18. dFail dw ? ;vieta, skirta saugoti duomenų failo deskriptoriaus numerį ("handle")
  19. dFail2 dw ?
  20. rFail dw ? ;vieta, skirta saugoti rezultato failo deskriptoriaus numerį
  21. kiek dw ?
  22. kiek2 dw ?
  23. failas1 db 20 dup (0)
  24. failas2 db 20 dup (0)
  25. failas3 db 20 dup (0)
  26. pranesimas1 DB "Nera irasytu parametru", 13, 10, "$"
  27. pranesimas2 DB "Ivyko klaida atidarant duomenu faila", 13, 10, "$"
  28. pranesimas3 DB "Ivyko klaida atidarant rezultato faila", 13, 10, "$"
  29. pranesimas4 DB "Ivyko klaida uzdarant duomenu faila", 13, 10, "$"
  30. pranesimas5 DB "Ivyko klaida uzdarant rezultato faila", 13, 10, "$"
  31. pranesimas6 DB "Ivyko klaida skaitant duomenis", 13, 10, "$"
  32. pranesimas7 DB "Ivyko dalinis irasymas", 13, 10, "$"
  33. pranesimas8 DB "Ivyko klaida rasant", 13, 10, "$"
  34. .code
  35. pradzia:
  36. MOV ax, @data ;reikalinga kiekvienos programos pradzioj
  37. MOV ds, ax ;reikalinga kiekvienos programos pradzioj
  38. MOV BX, 81h ;i BX ikeliam 81h reiksme, nes programos parametrai saugomi adresu ES:0081h
  39.  
  40. cmp byte ptr es:[80h],0
  41. je help
  42. dar:
  43. MOV AX, ES:[BX] ;nuskaitom pirmus du parametro baitus
  44. ;INC BX ;padidinam bx 1, kad per sekanti skaityma imtume 1 baitu toliau
  45. CMP AL, 13 ;palyginam ar pirmas nuskaitytas simbolis nera new line (ar kartais nepaspaude enter)
  46. je help
  47. cmp al,20h
  48. je tl
  49. tl:
  50. inc bx
  51. CMP AX, "/?"
  52. je help
  53. jne f1
  54. MOV AX, ES:[BX] ;nuskaitom per viena baita toliau, nes BX po praejusio nuskaitymo buvo padidintas 1
  55. CMP AH, 13
  56. je help
  57. inc bx
  58. jmp dar
  59.  
  60. help:
  61. MOV DX, offset pranesimas1 ;atspausdinam tai kas saugoma adresu uztagintu "pranesimas3"
  62. MOV AH, 09h ;zr google > int 21h > pirmas link
  63. INT 21h
  64.  
  65. JMP pabaiga
  66.  
  67.  
  68. f1:
  69. mov si, offset failas1
  70. inc bx
  71. f11:
  72. mov dl, byte ptr es:[bx]
  73. mov [si],dl
  74. inc si
  75. inc bx
  76. cmp byte ptr es:[bx],20h
  77. je f2
  78. jmp f11
  79.  
  80. f2:
  81. mov si, offset failas2
  82. inc bx
  83. f22:
  84. mov dl,byte ptr es:[bx]
  85. mov [si],dl
  86. inc si
  87. inc bx
  88. cmp byte ptr es:[bx],20h
  89. je f3
  90. jmp f22
  91.  
  92. f3:
  93. mov si, offset failas3
  94. inc bx
  95. f33:
  96. mov dl, byte ptr es:[bx]
  97. mov [si],dl
  98. inc si
  99. inc bx
  100. cmp byte ptr es:[bx],13
  101. je tol
  102. jmp f33
  103.  
  104. tol:
  105.  
  106.  
  107.  
  108.  
  109.  
  110. ;*****************************************************
  111. ;Duomenų failo atidarymas skaitymui
  112. ;*****************************************************
  113. MOV ah, 3Dh ;21h pertraukimo failo atidarymo funkcijos numeris
  114. MOV al, 00 ;00 - failas atidaromas skaitymui
  115. MOV dx, offset failas1 ;duom ;vieta, kur nurodomas failo pavadinimas, pasibaigiantis nuliniu simboliu
  116. INT 21h ;failas atidaromas skaitymui
  117. JC klaida1 ;AtidarantSkaitymui ;jei atidarant failą skaitymui įvyksta klaida, nustatomas carry flag
  118. MOV dFail, ax ;atmintyje išsisaugom duomenų failo deskriptoriaus numerį
  119.  
  120. ;*****************************************************
  121. ;Rezultato failo sukūrimas ir atidarymas rašymui
  122. ;*****************************************************
  123. MOV ah, 3Ch ;21h pertraukimo failo sukūrimo funkcijos numeris
  124. MOV cx, 0 ;kuriamo failo atributai
  125. MOV dx, offset failas3;rez ;vieta, kur nurodomas failo pavadinimas, pasibaigiantis nuliniu simboliu
  126. INT 21h ;sukuriamas failas; jei failas jau egzistuoja, visa jo informacija ištrinama
  127. JC klaida2 ;AtidarantRasymui ;jei kuriant failą skaitymui įvyksta klaida, nustatomas carry flag
  128. MOV rFail, ax ;atmintyje išsisaugom rezultato failo deskriptoriaus numerį
  129.  
  130. ;*****************************************************
  131. ;Duomenų nuskaitymas iš failo
  132. ;*****************************************************
  133. skaityk:
  134. MOV bx, dFail ;į bx įrašom duomenų failo deskriptoriaus numerį
  135. CALL SkaitykBuf ;iškviečiame skaitymo iš failo procedūrą
  136. mov kiek,ax
  137. CMP ax, 0 ;ax įrašoma, kiek baitų buvo nuskaityta, jeigu 0 - pasiekta failo pabaiga
  138. JE uzdaryti
  139.  
  140. ;Duomenų failo atidarymas skaitymui
  141. ;*****************************************************
  142. MOV ah, 3Dh ;21h pertraukimo failo atidarymo funkcijos numeris
  143. MOV al, 00 ;00 - failas atidaromas skaitymui
  144. MOV dx, offset failas2;duom2 ;vieta, kur nurodomas failo pavadinimas, pasibaigiantis nuliniu simboliu
  145. INT 21h ;failas atidaromas skaitymui
  146. JC klaida1 ;AtidarantSkaitymui ;jei atidarant failą skaitymui įvyksta klaida, nustatomas carry flag
  147. MOV dFail2, ax ;atmintyje išsisaugom duomenų failo deskriptoriaus numerį
  148.  
  149. ;Duomenų nuskaitymas iš failo
  150. ;*****************************************************
  151. skaityk2:
  152. MOV bx, dFail2 ;į bx įrašom duomenų failo deskriptoriaus numerį
  153. CALL SkaitykBuf2 ;iškviečiame skaitymo iš failo procedūrą
  154. mov kiek2,ax
  155. CMP ax, 0 ;ax įrašoma, kiek baitų buvo nuskaityta, jeigu 0 - pasiekta failo pabaiga
  156. JE uzdaryti2
  157.  
  158. jmp toliau
  159. klaida1:
  160. jmp klaidaAtidarantSkaitymui
  161.  
  162. klaida2:
  163. jmp klaidaAtidarantRasymui
  164. ;klaida3:
  165. ;jmp klaidaAtidarantSkaitymui
  166.  
  167. toliau:
  168.  
  169. jmp toliau2
  170. uzdaryti:
  171. jmp uzdarytiSkaitymui
  172. uzdaryti2:
  173. jmp uzdarytiSkaitymui2
  174. toliau2:
  175.  
  176.  
  177.  
  178.  
  179.  
  180. ;*****************************************************
  181. ;Darbas su nuskaityta informacija
  182. ;*****************************************************
  183. mov si,offset skBuf
  184. mov di,offset skBuf2
  185. mov bx,offset raBuf
  186.  
  187. add si, kiek
  188. dec si
  189. mov cx,kiek
  190. add bx, 100
  191.  
  192.  
  193. dirbk:
  194. mov dl,[si]
  195. mov [bx], dl
  196. dec si
  197. dec bx
  198. loop dirbk
  199.  
  200. add di ,kiek2
  201. dec di
  202. mov cx,kiek2
  203. add bx,kiek
  204. mov dh,0
  205.  
  206. dirbk2:
  207. mov dl, [di]
  208. sub dl,30h
  209. add [bx],dl
  210. dec di
  211. dec bx
  212. loop dirbk2
  213.  
  214. add bx,kiek2
  215. mov cx,101
  216. ar:
  217. mov dh,0
  218. mov dl,[bx]
  219. cmp dl,39h
  220. ja didinti
  221. jbe nieko
  222. didinti:
  223. sub dl,10d
  224. mov [bx],dl
  225. dec bx
  226. mov dl,1
  227. add [bx],dl
  228. jmp ar
  229. nieko:
  230. dec bx
  231. loop ar
  232.  
  233.  
  234. mov cx,raBufDydis
  235. inc cx
  236. mov si,offset raBuf2
  237. again:
  238. dec cx
  239. inc bx
  240. mov dl,[bx]
  241. cmp dl,30h
  242. jne baik
  243. jmp again
  244. baik:
  245. mov dl,[bx]
  246. mov [si],dl
  247. inc bx
  248. inc si
  249. inc kiek
  250. loop baik
  251.  
  252.  
  253. iseik:
  254.  
  255. ;*****************************************************
  256. ;Rezultato įrašymas į failą
  257. ;*****************************************************
  258. MOV cx, kiek ;cx - kiek baitų reikia įrašyti
  259. MOV bx, rFail ;į bx įrašom rezultato failo deskriptoriaus numerį
  260. CALL RasykBuf ;iškviečiame rašymo į failą procedūrą
  261. ;CMP cx, skBufDydis ;jeigu vyko darbas su pilnu buferiu -> iš duomenų failo buvo nuskaitytas pilnas buferis ->
  262. ;JE skaityk ;-> reikia skaityti toliau
  263.  
  264. ;*****************************************************
  265. ;Rezultato failo uždarymas
  266. ;*****************************************************
  267. uzdarytiRasymui:
  268. MOV ah, 3Eh ;21h pertraukimo failo uždarymo funkcijos numeris
  269. MOV bx, rFail ;į bx įrašom rezultato failo deskriptoriaus numerį
  270. INT 21h ;failo uždarymas
  271. JC klaidaUzdarantRasymui ;jei uždarant failą įvyksta klaida, nustatomas carry flag
  272.  
  273.  
  274.  
  275. ;*****************************************************
  276. ;Duomenų failo uždarymas
  277. ;*****************************************************
  278. uzdarytiSkaitymui:
  279. MOV ah, 3Eh ;21h pertraukimo failo uždarymo funkcijos numeris
  280. MOV bx, dFail ;į bx įrašom duomenų failo deskriptoriaus numerį
  281. INT 21h ;failo uždarymas
  282. JC klaidaUzdarantSkaitymui ;jei uždarant failą įvyksta klaida, nustatomas carry flag
  283.  
  284. uzdarytiSkaitymui2:
  285. MOV ah, 3Eh ;21h pertraukimo failo uždarymo funkcijos numeris
  286. MOV bx, dFail2 ;į bx įrašom duomenų failo deskriptoriaus numerį
  287. INT 21h ;failo uždarymas
  288. JC klaidaUzdarantSkaitymui
  289.  
  290.  
  291. pabaiga:
  292. MOV ah, 4Ch ;reikalinga kiekvienos programos pabaigoj
  293. MOV al, 0 ;reikalinga kiekvienos programos pabaigoj
  294. INT 21h ;reikalinga kiekvienos programos pabaigoj
  295.  
  296. ;*****************************************************
  297. ;Klaidų apdorojimas
  298. ;*****************************************************
  299. klaidaAtidarantSkaitymui:
  300. MOV DX, offset pranesimas2 ;atspausdinam tai kas saugoma adresu uztagintu "pranesimas3"
  301. MOV AH, 09h ;zr google > int 21h > pirmas link
  302. INT 21h ;<klaidos pranešimo išvedimo kodas>
  303.  
  304. JMP pabaiga
  305. klaidaAtidarantRasymui:
  306. MOV DX, offset pranesimas3 ;atspausdinam tai kas saugoma adresu uztagintu "pranesimas3"
  307. MOV AH, 09h ;zr google > int 21h > pirmas link
  308. INT 21h ;<klaidos pranešimo išvedimo kodas>
  309. JMP pabaiga
  310. klaidaUzdarantRasymui:
  311. MOV DX, offset pranesimas4 ;atspausdinam tai kas saugoma adresu uztagintu "pranesimas3"
  312. MOV AH, 09h ;zr google > int 21h > pirmas link
  313. INT 21h ;<klaidos pranešimo išvedimo kodas>
  314. JMP pabaiga
  315. klaidaUzdarantSkaitymui:
  316. MOV DX, offset pranesimas5 ;atspausdinam tai kas saugoma adresu uztagintu "pranesimas3"
  317. MOV AH, 09h ;zr google > int 21h > pirmas link
  318. INT 21h ;<klaidos pranešimo išvedimo kodas>
  319. JMP pabaiga
  320.  
  321. ;*****************************************************
  322. ;Procedūra nuskaitanti informaciją iš failo
  323. ;*****************************************************
  324. PROC SkaitykBuf
  325. ;į BX paduodamas failo deskriptoriaus numeris
  326. ;į AX bus grąžinta, kiek simbolių nuskaityta
  327. PUSH cx
  328. PUSH dx
  329.  
  330. MOV ah, 3Fh ;21h pertraukimo duomenų nuskaitymo funkcijos numeris
  331. MOV cx, skBufDydis ;cx - kiek baitų reikia nuskaityti iš failo
  332. MOV dx, offset skBuf ;vieta, į kurią įrašoma nuskaityta informacija
  333. INT 21h ;skaitymas iš failo
  334. JC klaidaSkaitant ;jei skaitant iš failo įvyksta klaida, nustatomas carry flag
  335.  
  336. SkaitykBufPabaiga:
  337. POP dx
  338. POP cx
  339. RET
  340.  
  341. klaidaSkaitant:
  342. MOV DX, offset pranesimas6 ;atspausdinam tai kas saugoma adresu uztagintu "pranesimas3"
  343. MOV AH, 09h ;zr google > int 21h > pirmas link
  344. INT 21h ;<klaidos pranešimo išvedimo kodas>
  345. MOV ax, 0 ;Pažymime registre ax, kad nebuvo nuskaityta nė vieno simbolio
  346. JMP SkaitykBufPabaiga
  347. SkaitykBuf ENDP
  348.  
  349. PROC SkaitykBuf2
  350. ;į BX paduodamas failo deskriptoriaus numeris
  351. ;į AX bus grąžinta, kiek simbolių nuskaityta
  352. PUSH cx
  353. PUSH dx
  354.  
  355. MOV ah, 3Fh ;21h pertraukimo duomenų nuskaitymo funkcijos numeris
  356. MOV cx, skBufDydis2 ;cx - kiek baitų reikia nuskaityti iš failo
  357. MOV dx, offset skBuf2 ;vieta, į kurią įrašoma nuskaityta informacija
  358. INT 21h ;skaitymas iš failo
  359. JC klaidaSkaitant2 ;jei skaitant iš failo įvyksta klaida, nustatomas carry flag
  360.  
  361. SkaitykBufPabaiga2:
  362. POP dx
  363. POP cx
  364. RET
  365.  
  366. klaidaSkaitant2:
  367. MOV DX, offset pranesimas6 ;atspausdinam tai kas saugoma adresu uztagintu "pranesimas3"
  368. MOV AH, 09h ;zr google > int 21h > pirmas link
  369. INT 21h ;<klaidos pranešimo išvedimo kodas>
  370. MOV ax, 0 ;Pažymime registre ax, kad nebuvo nuskaityta nė vieno simbolio
  371. JMP SkaitykBufPabaiga2
  372. SkaitykBuf2 ENDP
  373.  
  374. ;*****************************************************
  375. ;Procedūra, įrašanti buferį į failą
  376. ;*****************************************************
  377. PROC RasykBuf
  378. ;į BX paduodamas failo deskriptoriaus numeris
  379. ;į CX - kiek baitų įrašyti
  380. ;į AX bus grąžinta, kiek baitų buvo įrašyta
  381. PUSH dx
  382.  
  383. MOV ah, 40h ;21h pertraukimo duomenų įrašymo funkcijos numeris
  384. MOV dx, offset raBuf2 ;vieta, iš kurios rašom į failą
  385. INT 21h ;rašymas į failą
  386. JC klaidaRasant ;jei rašant į failą įvyksta klaida, nustatomas carry flag
  387. CMP cx, ax ;jei cx nelygus ax, vadinasi buvo įrašyta tik dalis informacijos
  388. JNE dalinisIrasymas
  389.  
  390. RasykBufPabaiga:
  391. POP dx
  392. RET
  393.  
  394. dalinisIrasymas:
  395. MOV DX, offset pranesimas7 ;atspausdinam tai kas saugoma adresu uztagintu "pranesimas3"
  396. MOV AH, 09h ;zr google > int 21h > pirmas link
  397. INT 21h ;<klaidos pranešimo išvedimo kodas>
  398. JMP RasykBufPabaiga
  399. klaidaRasant:
  400. MOV DX, offset pranesimas8 ;atspausdinam tai kas saugoma adresu uztagintu "pranesimas3"
  401. MOV AH, 09h ;zr google > int 21h > pirmas link
  402. INT 21h ;<klaidos pranešimo išvedimo kodas>
  403. MOV ax, 0 ;Pažymime registre ax, kad nebuvo įrašytas nė vienas simbolis
  404. JMP RasykBufPabaiga
  405. RasykBuf ENDP
  406. END pradzia
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement