ASSEMBLY GYAKORLAT 6. Irta Kaproncai Tamas [tomcat@szif.hu] -MAKROK- 24a. Irjuk meg az elso makronk, ami egy billentyu leutesere var! %macro BillVar 0 MOV AH,0 INT 16H %endmacro Vizsgaljuk meg az elso sort: kulcsszo: %macro, nev: BillVar, parameterek szama: 0 Mivel a makro nevet vegyesen, kicsi es nagy betukkel irtuk; a makro hasznalatakor konnyen hibazhatunk, elgepelhetjuk a makro nevet. A javaslatom az, hogy hasznaljatok vagy csupa kis betus vagy csupa nagy betus makroneveket (a nagybetus az altalanosan elfogadott). A masik ut ezen hiba lehetoseg kivedesere a %imacro kulcsszo hasznalata a %macro helyett. 24b. A masodik makro legyen a programbol valo kilepes DOS hibakoddal! %macro HIBAKOD 1 MOV AX,4C00H + %1 INT 21H %endmacro - A "%1" az elso parameter erteket helyettesiti. Probaljuk meg ezt a ket makrot hasznalni: BillVar HIBAKOD 0 *** Figyelem! *** A makro definiciojanak mindig meg kell eloznie a makrora valo hivatkozast! 25a. Irjunk meg egy sztringkiiro makrot! Azert, hogy kenyelmesebb legyen a makrot hasznalmi, nem a karakterlanc cimet adjuk at parameterkent, hanem magat a sztringet. Tehat a foprogram igy fog modosulni: ORG 100H PRINT 'Hello!',7 BillVar HIBAKOD 0 Elotte a makrokhoz pedig be kell szurni a kovetkezot: %macro PRINT 1+ JMP %%atlep %%szoveg: DB %1,'$' %%atlep: MOV DX,%%szoveg MOV AH,9 INT 21H %endmacro - A parameterek szamanal az 1+ azt jelenti, hogy az elso lesz az utolso parameter, vagyis ezt kovetoen a vesszok nem hatarolnak ujabb parametereket, hanem a vesszo is az utolso parameter resze. - "%%" kezdetu cimkek, a makrok lokalis cimkei. (Mivel az szoveges adatot is a program utasitasai koze helyezi a makro, ezert azt at kell ugrania a programnak, hiszen arra vezerles nem kerulhet, azt nem szabad, hogy a processzor utasitasoknak probalja meg ertelmezni). Ha kiprobaljuk a programot a Hello! feliraton kivul, futyulni is fog egyet a 7-es vezerlo karakternek koszonhetoen. 25b. Keszitsunk makrokonyvtarat! A programunk elejen levo makrokat emeljuk ki egy "MAKROK.INC" nevu kulon fajlba. Ahol pedig a makroink voltak, irjuk be helyettuk, hogy %include "makrok.inc" 26a. A 22. feladat masolo programjat irjuk meg fajlkezelo makrokkal, elso lepesben csak toltsunk be egy rovid fajlt! Ez kb. igy nez majd ki, megirva a megfelelo makrotartalmakat: %include "makrok.inc" ORG 100H FOPEN BX,'C.BAT',READ FREAD BX,Puffer,32768 FCLOSE BX HIBAKOD 0 section .bss Puffer RESB 32768 A READ a fajl megnyitasanak modjara utal es tulajdonkeppen egy szam konstanst takar, eloszor definialjuk ezeket a konstans ertekeket: %define READ 0 ; (ez kb. ugyanaz, mint a READ EQU 0) %define WRITE 1 %define BOTH 2 Johetnek a makrok: %macro FOPEN 2-3 READ JMP %%atlep ; szoveges adat atugrasa %%fnev: DB %2,0 ; 2. parameterkent kapott fajlnev letarolasa %%atlep: MOV DX,%%fnev ; fajlnev cimenek betoltese MOV AX,3D00H + %3 ; fajl nyitasanak modjat a 3. parameter adaja INT 21H JNC %%fajlok ; ha sikerult a megnyitas, akkor tovabb PRINT 'file not found' ; ha nem, akkor hibauzenet HIBAKOD 1 ; ez a hiba legyen az 1-es szamu %%fajlok: MOV %1,AX ; sikeres nyitaskor a fajlszam eltarolasa %endmacro - Ez a makro 2 es 3 parameterrel is hasznalhato. Ha nem adjuk meg a harmadik parametert, akkor az alapertelmezett erteket kapja, jelen esetben a READ-del lesz egyenlo. A masik ket makrot probaljuk meg onalloan megcsinalni! Ezek joval egyszerubbek lesznek: %macro FREAD 3 MOV BX,%1 MOV DX,%2 MOV CX,%3 MOV AH,3FH INT 21H %endmacro %macro FCLOSE 1 MOV BX,%1 MOV AH,3EH INT 21H %endmacro Ha ezt mind jol beirtuk es sikeresen lefordult a program, akkor sem latszik semmi a kepernyon, hiszen meg csak a memoriaba toltottuk be az adott fajlt (C.BAT). Legfeljebb arrol tudunk megbizonyosodni, hogyha atnevezzuk a keresett fajlt, akkor hibauzenetet kell adni a programunknak. 26b. Az elozoekben betoltott fajlt irjuk ki egy uj fajlba! Ehhez meg kell jegyezni a betoltott bajtok szamat es meg kell irni tovabbi ket makrot! Ime az ujabb foprogram: %include "makrok.inc" ORG 100H FOPEN BX,'C.BAT',READ FREAD BX,Puffer,32768 PUSH AX ; a betoltott bajtok szama a verembe kerul FCLOSE BX FCREATE BX,'UJ.BAT',0 POP CX ; a kiirando bajtok szamat a verembol vesszuk FWRITE BX,Puffer,CX FCLOSE BX HIBAKOD 0 section .bss Puffer RESB 32768 Az FCREATE makro az FOPEN-re hasonlit: %macro FCREATE 2-3 0 JMP %%atlep ; szoveges adat atugrasa %%fnev: DB %2,0 ; 2. parameterkent kapott fajlnev letarolasa %%atlep: MOV DX,%%fnev ; fajlnev cimenek betoltese MOV CX,3CH ; a fajl attributumat a 3. parameter adja MOV AH,3CH ; fajl letrehozasa INT 21H JNC %%fajlok ; ha sikerult a letrehozas, akkor tovabb PRINT 'access denied' ; ha nem, akkor hibauzenet HIBAKOD 2 ; ez a hiba legyen az 2-es szamu %%fajlok: MOV %1,AX ; sikeres letrehozaskor a fajlszam eltarolasa %endmacro Itt nem volt ertelme nyitas modjarol beszelni, hiszen egy uj, ures fajlbol nem lehet mit olvasni. Viszont az uj fajl kap egy un. attributum erteket, melyenek az egyes bitjei a fajl specialis tulajdonsagait jelolik (rejtett, csak olvashato, rendszer stb.). A 0 ertekben egy bit sincs bekapcsolva, ezert egy teljesen szimpla fajlt hozunk letre. A fajlba torteno iras makroja hasonlit az olvasasera, azzal az elteressel, hogy iras utan illik meg vizsgalni a muvelet sikeresseget, azaz hogy, a kiirando bajtok szama es a kiirt bajtok szama azonos-e. %macro FWRITE 3 MOV BX,%1 MOV DX,%2 MOV CX,%3 MOV AH,40H INT 21H CMP AX,CX ; AX: kiirt bajtok, CX: kiirando bajtok szama JE %%mentok PRINT 'Disk full' ; a megtelt a lemez legyen a 3-as szamu hiba HIBAKOD 3 %%mentok: %endmacro 26c. A masolo program mukodeset terjesszuk ki a hosszu fajlokra is! %define PUFFERH 32768 %include "makrok.inc" ORG 100H FOPEN [fszam1],'C.BAT',READ FCREATE [fszam2],'UJ.BAT',0 ujra: FREAD [fszam1],Puffer,PUFFERH FWRITE [fszam2],Puffer,AX CMP AX,PUFFERH JE ujra FCLOSE [fszam1] FCLOSE [fszam2] HIBAKOD 0 section .bss Puffer RESB PUFFERH 27. Probaljuk meg megoldani a 23. feladatot egy FSEEK es egy SZAMKIIR makro megirasaval!