ASSEMBLY GYAKORLAT 5. Irta Kaproncai Tamas [tomcat@szif.hu] -FAJLKEZELES 2.- Onallo munka: ------------- Probaljuk ki az ASMGYAK4.TXT 20. feladatat! Oldjuk meg a 21. es 22. feladatokat! 21a. Mentsuk ki a memoria egy blokkjat egy uj fajlba! (A memoria cim: [C000:0], meret: 512 bajt, a fajlnev: VGABIOS.BIN). (A 20. feladatbol erdemes kiindulni). ORG 100H MOV AH,3CH ; fajl letrehozasa MOV CX,0 ; a fajl attributuma: 0 => normal MOV DX,FajlNev ; melyik fajl kell megnyitni INT 21H ; a DOS megprobalja letrehozni a fajlt JNC FajlOke ; ha sikerult, akkor ugras tovabb MOV AH,9 ; sztring kiiras DOS funkcioval MOV DX,Hiba1 ; a hiba uzenet cimkeje INT 21H ; megejelenik a hibauzenet MOV AX,4C01H ; kilepes 1-es hibakoddal INT 21H FajlOke: MOV BX,AX ; a fajlt azonosito fajlszam attoltese BX-be MOV AH,40H ; a DOS kimentes funkcioja PUSH DS ; DS regiszter tartalmanak verembe mentese MOV DX,0C000H ; DX-be teszem C000-t DS beallitasahoz MOV DS,DX ; DS:DX altal mutatott memoricimrol MOV DX,0 ; fogjuk a bajtokat fajlba irni MOV CX,512 ; a kiirando bajtok szama INT 21H ; DOS megprobalja a mentest POP DS ; DS eredeti ertekenek visszaallitasa CMP AX,CX ; Annyi bajtot mentet, amennyit akartunk? JE MentOk ; ha igen, akkor tovabb... MOV AH,3EH ; fajl lezarasa INT 21H MOV AH,9 ; sztring kiiras DOS funkcioval MOV DX,Hiba2 ; a hiba uzenet cimkeje INT 21H ; megejelenik a hibauzenet MOV AX,4C02H ; kilepes 2-es hibakoddal INT 21H MentOk: MOV AH,3EH ; fajl lezarasa INT 21H MOV AX,4C00H ; normal kilepes INT 21H FajlNev DB 'VGABIOS.BIN',0 ; akar teljes fajlspecifikacio, amit 0 zar le Hiba1 DB 'Nem lehet fajlt letrehozni',10,13,'$' ; DOS sztring Hiba2 DB 'Megtelt a lemez',10,13,'$' ; DOS sztring 22a. Irjunk masolo programot, ami adott fajlt atmasol adott nevre! (A 20. feladatbol erdemes kiindulni, hozzateve a 21. feladatot is). ORG 100H MOV AH,3DH ; fajl megnyitasa MOV AL,0 ; a nyitas modja: 0 => olvasasra nyitas MOV DX,FajlNev ; melyik fajl kell megnyitni INT 21H ; a DOS megprobalja megnyitni a fajlt JNC FajlOke ; ha sikerult, akkor ugras tovabb MOV AH,9 ; sztring kiiras DOS funkcioval MOV DX,Hiba1 ; a hiba uzenet cimkeje INT 21H ; megejelenik a hibauzenet MOV AX,4C01H ; kilepes 1-es hibakoddal INT 21H FajlOke: MOV BX,AX ; a fajlt azonosito fajlszam attoltese BX-be MOV AH,3FH ; a DOS betoltes funkcioja MOV DX,Puffer ; a memoriacim, ahova tolteni fogunk MOV CX,32768 ; a toltendo bajtok szama, ennel rovidebb INT 21H ; fajlok teljesen be fognak toltodni PUSH AX ; tenylegesen betoltott bajtok szamat elmentjuk MOV AH,3EH ; fajl lezarasa INT 21H MOV AH,3CH ; fajl letrehozasa MOV CX,0 ; a fajl attributuma: 0 => normal MOV DX,FajlNev2 ; melyik fajl kell megnyitni INT 21H ; a DOS megprobalja letrehozni a fajlt JNC FajlOke2 ; ha sikerult, akkor ugras tovabb MOV AH,9 ; sztring kiiras DOS funkcioval MOV DX,Hiba2 ; a hiba uzenet cimkeje INT 21H ; megejelenik a hibauzenet MOV AX,4C02H ; kilepes 2-es hibakoddal INT 21H FajlOke2: MOV BX,AX ; a fajlt azonosito fajlszam attoltese BX-be MOV AH,40H ; a DOS kimentes funkcioja MOV DX,Puffer ; a memoriacim, ahonnan menteni fogunk POP CX ; annyi bajtot mentunk, amennyit betoltottunk INT 21H ; DOS megprobalja a mentest CMP AX,CX ; Annyi bajtot mentet, amennyit akartunk? JE MentOk ; ha igen, akkor tovabb... MOV AH,3EH ; fajl lezarasa INT 21H MOV AH,9 ; sztring kiiras DOS funkcioval MOV DX,Hiba3 ; a hiba uzenet cimkeje INT 21H ; megejelenik a hibauzenet MOV AX,4C03H ; kilepes 3-es hibakoddal INT 21H MentOk: MOV AH,3EH ; fajl lezarasa INT 21H MOV AX,4C00H ; normal kilepes INT 21H FajlNev DB 'C.BAT',0 ; beolvasando fajl FajlNev2 DB 'UJ.BAT',0 ; letrehozando fajl Hiba1 DB 'Nincs ilyen fajl',10,13,'$' ; DOS sztring Hiba2 DB 'Nem lehet fajlt letrehozni',10,13,'$' ; DOS sztring Hiba3 DB 'Megtelt a lemez',10,13,'$' ; DOS sztring section .bss Puffer RESB 32768 ; 32768 bajt lefoglalasa 22b. Barmely hosszu fajlt is tudjon masolni a program! (A 22a. feladatbol erdemes kiindulni, ebben az esetben a ket fajlt egyszerre kell kezelni, szeletenkent betolteni es rogton ki is menteni). ORG 100H MOV AH,3DH ; fajl megnyitasa MOV AL,0 ; a nyitas modja: 0 => olvasasra nyitas MOV DX,FajlNev ; melyik fajl kell megnyitni INT 21H ; a DOS megprobalja megnyitni a fajlt JNC FajlOke ; ha sikerult, akkor ugras tovabb MOV AH,9 ; sztring kiiras DOS funkcioval MOV DX,Hiba1 ; a hiba uzenet cimkeje INT 21H ; megejelenik a hibauzenet MOV AX,4C01H ; kilepes 1-es hibakoddal INT 21H FajlOke: MOV [fszam1],AX ; a fajlszam memoria valtozoba toltese MOV AH,3CH ; fajl letrehozasa MOV CX,0 ; a fajl attributuma: 0 => normal MOV DX,FajlNev2 ; melyik fajl kell megnyitni INT 21H ; a DOS megprobalja letrehozni a fajlt JNC FajlOke2 ; ha sikerult, akkor ugras tovabb MOV AH,9 ; sztring kiiras DOS funkcioval MOV DX,Hiba2 ; a hiba uzenet cimkeje INT 21H ; megejelenik a hibauzenet MOV AX,4C02H ; kilepes 2-es hibakoddal INT 21H FajlOke2: MOV [fszam2],AX ; a fajlszam memoria valtozoba toltese Ujra: MOV BX,[fszam1] ; a regi fajl azonositoja MOV AH,3FH ; a DOS betoltes funkcioja MOV DX,Puffer ; a memoriacim, ahova tolteni fogunk MOV CX,32768 ; a toltendo bajtok szama, ennel rovidebb INT 21H ; fajlok teljesen be fognak toltodni PUSH AX ; tenylegesen betoltott bajtok szamat elmentjuk MOV BX,[fszam2] ; az uj fajl azonositoja MOV AH,40H ; a DOS kimentes funkcioja MOV DX,Puffer ; a memoriacim, ahonnan menteni fogunk POP CX ; annyi bajtot mentunk, amennyit betoltottunk INT 21H ; DOS megprobalja a mentest CMP AX,CX ; Annyi bajtot mentet, amennyit akartunk? JE MentOk ; ha igen, akkor tovabb... MOV BX,[fszam1] ; a regi fajl azonositoja MOV AH,3EH ; fajl lezarasa INT 21H MOV BX,[fszam2] ; az uj fajl azonositoja MOV AH,3EH ; fajl lezarasa INT 21H MOV AH,9 ; sztring kiiras DOS funkcioval MOV DX,Hiba3 ; a hiba uzenet cimkeje INT 21H ; megejelenik a hibauzenet MOV AX,4C03H ; kilepes 3-es hibakoddal INT 21H MentOk: CMP CX,32768 ; Vege van-e a fajlnak? JE Ujra ; Ha nem (tele volt a puffer), akkor vissza... MOV BX,[fszam1] ; a regi fajl azonositoja MOV AH,3EH ; fajl lezarasa INT 21H MOV BX,[fszam2] ; az uj fajl azonositoja MOV AH,3EH ; fajl lezarasa INT 21H MOV AX,4C00H ; normal kilepes INT 21H FajlNev DB 'C.BAT',0 ; beolvasando fajl FajlNev2 DB 'UJ.BAT',0 ; letrehozando fajl Hiba1 DB 'Nincs ilyen fajl',10,13,'$' ; DOS sztring Hiba2 DB 'Nem lehet fajlt letrehozni',10,13,'$' ; DOS sztring Hiba3 DB 'Megtelt a lemez',10,13,'$' ; DOS sztring section .bss fszam1 RESW 1 ; a regi fajl azonositoja fszam2 RESW 1 ; az uj fajl azonositoja Puffer RESB 32768 ; 32768 bajt lefoglalasa 22c. A Puffer terulet hosszat emeljuk ki szoveges konstanskent a fajl elejere! Uj sor: %define PufferHossz 32768 Modositando sorok: MOV CX,PufferHossz ; a toltendo bajtok szama, ennel rovidebb CMP CX,PufferHossz ; Vege van-e a fajlnak? Puffer RESB PufferHossz ; PufferHossz szamu bajt lefoglalasa 23. Irjuk ki a kepernyore adott fajl hosszat! ORG 100H MOV AX,3D00H ; fajl megnyitasa, 0 => olvasasra nyitas MOV DX,FajlNev ; melyik fajl kell megnyitni INT 21H ; a DOS megprobalja megnyitni a fajlt JNC FajlOke ; ha sikerult, akkor ugras tovabb MOV AH,9 ; sztring kiiras DOS funkcioval MOV DX,Hiba1 ; a hiba uzenet cimkeje INT 21H ; megejelenik a hibauzenet MOV AX,4C01H ; kilepes 1-es hibakoddal INT 21H FajlOke: MOV BX,AX ; a fajlt azonosito fajlszam attoltese BX-be MOV AH,42H ; relativ pozicio megadasa MOV AL,02H ; 2 -> fajl vegetol MOV CX,0 ; CX:DX = 0 -> nincs elmozdulas MOV DX,0 INT 21H ; DX:AX az abszolut fajl pozicio (most a hossz) MOV SI,szamstr + 5 ; az utolso szamjegy helye a sztringben .ujra: MOV CX,10 ; 10-es osztassal valasztunk le egy jegyet DIV CX ; hanyados -> AX, maradek -> DX ADD DL,'0' ; a kapott szamjegy karakterre alakitasa MOV [SI],DL ; egy karakter beirsa a sztringbe DEC SI ; lepes a kovetkezo jegy mem.cimehez MOV DX,0 CMP AX,0 ; Van meg mit osztani? JNZ .ujra ; ha igen, akkor ujabb iteracio INC SI MOV AH,9 ; a szam sztringjenek kiiras MOV DX,SI INT 21H MOV AH,3EH ; fajl lezarasa INT 21H MOV AX,4C00H ; normal kilepes INT 21H szamstr DB ' $' ; helyfoglalas a sztringnek (min. 6 karakter). FajlNev DB 'C.BAT',0 ; beolvasando fajl Hiba1 DB 'Nincs ilyen fajl',10,13,'$' ; DOS sztring