|
reastra MS-DOS in care ruleaza programul si apoi relansati TC.exe
|
səhifə | 45/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| reastra MS-DOS in care ruleaza programul si apoi relansati TC.exe.
FUNCTIA MK_FP()
-creaza un pointer far din offsetul si segmentul datelor
SINTAXA GENERALA este: void far * MK_FP(unsigned seg,unsigned ofs);
Functia este de fapt un macro care utilizeaza offset-ul (FP_OFF) si seg-
mentul (FP_SEG) pentru a crea un pointer de tip far spre datele specifi-
cate (pointerul far poate fi orientat si spre date din memoria extinsa).
Functia se utilizeaza pentru a dierctiona executia altor functii spre
adresa de memorie a datelor(functiile care utilizeaza pointeri spre date).
Este foarte utila,mai ales pentru datele din memoria extinsa.
Functia returneaza pointerul realizat (datele pot fi apelate direct).
-340- [ dos.h -nosound() si outp() ]
EXEMPLU: #include
#include
char *sir1="Arhiva de date nr.1";
char far *farsir1;
main()
{ farsir1=MK_FP(FP_SEG(sir1),FP_OFF(sir1));
printf("Pointerul far este orientat spre: %s \n",farsir1);
sleep(3);
}
Pentru a utiliza memoria extinsa,scrieti datele la o adresa din memoria
extinsa si apoi utilizati MK_FP() pentru a crea pointerul spre ele.
FUNCTIA nosound()
-inchide difuzorul,dupa ce a fost apelata o functie sound().
SINTAXA GENERALA este: void nosound(void);
Functia amuteste (intrerupe) un sunet generat cu sound().Se utilizeaza
pentru a intrerupe sunetele,sau pentru a inchide difuzorul complet.
Functia nu returneaza nici o valoare (nu este depanabila).
EXEMPLU: #include
int x,y;
main()
{ y=50;
for (x=10;x<100;x++)
{ sound(y*x);
delay(2800);
nosound();
delay(250);
};
for (x=100;x>10;x--)
{ sound(y*x);
delay(300);
nosound();
delay(50);
}; }
FUNCTIA outp()
-scrie un byte in portul hardware (canalul de comunicatie)
SINTAXA GENERALA este: int outp(int portid,int byte_value);
Functia scrie octetul specificat prin byte_value in portul cu numarul
portid.In unele versiuni functia este asimilata cu outportb() (identica).
EXEMPLU: #include
#include
int port,x;
main()
{ port=1;
x=9;
outp(port,x);
printf("S-a transmis: %d \n",inport(port));
sleep(3);
}
Se utilizeaza pentru transfer de date,intre unitati diferite.
-341- [ dos.h- outport() si outportb() ]
FUNCTIA outport()
-scrie un byte sau un cuvant (doi bytes) in portul hardware
SINTAXA GENERALA este: void outport(int portid,int value);
Functia opereaza la fel ca o instructiune 8086 OUT.Scrie in portul speci-
ficat prin portid un byte,sau un cuvant,caz in care primul octet va fi
scris in portul specificat iar cel de al doilea in portul portid+1 (cel
care succede portul specificat).
Functia nu returneaza valori (nu este depanabila automat).
EXEMPLU: #include
#include
int port,x;
main()
{ port=1;
x='A';
outport(port,x);
printf("A fost transmis urmatorul byte: %d \n",inport(port));
sleep(3);
}
Numarul returnat reprezinta valoarea ASCII a caracterului specificat.
FUNCTIA outportb()
-scrie un byte in portul hardware,specificat prin valoarea sa unsigned
SINTAXA GENERALA este: void outportb(int portid,unsigned char value);
Functia este de fapt un macro care opereaza la fel ca instructiunea 8086
OUT.Scrie un byte in portul specificat.
Daca doriti sa utilizati outportb() pe post de functie,fie omiteti sa
includeti fila de antet in etapa de preprocesare,fie includeti
fila dar anulati definitia macro-ului cu #undef outportb().
In unele dintre versiuni (inclusiv Turbo C) outportb() este asimilata cu
outp() (este identica).
Functia nu returneaza valori.
EXEMPLU: #include
#include
int port;
char x;
main()
{ port=1;
x=65;
outportb(port,x);
printf("A fost transmis urmatorul byte: %d \n",inport(port));
sleep(3);
}
Functiile inp(),inport() si inportb() se utilizeaza de obicei cuplate cu
outp(),outport() sau outportb(),sub forma de algoritmi iterativi,pentru
a putea transmite si receptiona mesaje complete (gen e-mail),sau pentru
a asigura comunicarea dintre diferite componente,unitati de procesare sau
stocare a datelor,comunicarea dintre om si masina etc.(caz in care se
utilizeaza instructiuni transmise in cod masina).Mesajele si instruc-
tiunile se transmit octet cu octet,cu sau fara caractere de separatie.
Programele actuale,opereaza la fel,dar cu grupuri mai mici sau mai mari
de caractere transmise simultan (fie serial,fie pe port paralel).
-342- [dos.h-parsfnm() si peek() ]
FUNCTIA parsfnm()
-analizeaza numele unei file (dintr-un sir de caractere)
SINTAXA GENERALA este:
char *parsfnm(const char *cmdline,struct fcb *fcb,int opt);
Functia analizeaza sirul spre care este orientat pointerul cmdline,pentru
a identifica si arhiva numele unei file din program.De obicei sirul ana-
lizat este o linie de comanda din program.Daca sirul contine un nume de
fila in format standard DOS (8 caractere,punct si extensie),atunci functia
va utiliza o structura de tip fcb (definita in
numele unitatii de memorie,numele si extensia filei.Structura fcb spre
care este orientat pointerul specificat prin *fcb poarta numele de bloc
de control al filei (FCB=file control block).
Parametrul optional opt este valoarea registrului AL,necesara pentru
functia DOS care va efectua analiza sirului (vezi manualul DOS referitor
la intreruperea 0x29 pentru date despre operatiile executate in cursul
analizei-sau functia corespondenta din versiunea DOS pe care o detineti).
Functia returneaza un pointer spre primul byte care urmeaza dupa numele
filei (dupa extensie) sau in caz de eroare,returneaza NULL.
EXEMPLU: #include
#include
#include
struct fcb fila1;
main()
{
parsfnm("C:GRAFICA.obj",&fila1,1);
printf("unitatea este: %d \n",fila1.fcb_drive);
printf("numele este: %s \n",fila1.fcb_name);
printf("extensia este: %s \n",fila1.fcb_ext);
sleep(3);
}
Pentru ca numele filei sa poata fi analizat,trebuie ca numele unitatii sa
fie urmat de doua puncte(:) iar numele filei sa fie urmat de punct.Daca
numele filei este mai lung de 8 caractere,va fi amputat.Valoarea returnata
pentru unitate este 1=A,2=B,3=C...etc.
FUNCTIA peek()
-returneaza un cuvant(2 bytes) de la adresa de memorie specificata
SINTAXA GENERALA este: int peek(unsigned segment,unsigned offset);
Functia utilizeaza segmentul si offset-ul datelor pentru a prelua de la
adresa respectiva de memorie 2 bytes (un cuvant=2 octeti=16 biti=o linie).
Functia este de fapt un macro care extinde citirea la intreaga linie.
Functia returneaza valoarea (ASCII) citita de la adresa respectiva.
EXEMPLU: #include
#include
int a,valoare;
main()
{ for (a=1;a<20;a++)
{ valoare=peek(8,a);
printf("adresa=0x%X valoare=%d \n"a,valoare); };
sleep(5);
}
-343- [ dos.h -peekb() si poke() ]
EXEMPLUL 2: #include
#include
char *text="A";
main()
{ printf("Variabila text contine valoarea: \n");
printf("%d \n",peek(FP_SEG(text),FP_OFF(text)));
sleep(3);
}
FUNCTIA peekb()
-returneaza un byte de memorie de la adresa specificata
SINTAXA GENERALA este: char peekb(unsigned segment,unsigned offset);
Functia utilizeaza segmentul si ofset-ul datelor pentru a returna un byte
de la adresa specificata (prin segment si offset).Este identica cu peek(),
dar returneaza o valoare de tip caracter,pentru un singur byte.Este tot
un macro (care extinde citirea la intreaga linie de cod).Poate fi derefe-
rita cu #undef peekb() (caz in care va fi interpretata ca o functie oare-
care definita de utilizator).
Functia returneaza byte-ul de informatie de la adresa din offset.
EXEMPLU: #include
#include
char *text="Zx";
main()
{ printf("Variabila contine caracterul: \n");
printf("%c \n",peekb(FP_SEG(text),FP_OFF(text)));
sleep(3);
}
FUNCTIA poke()
-arhiveaza o valoare de tip int la adresa specificata
SINTAXA GENERALA este:
void poke(unsigned segment,unsigned offset,int value);
Functia arhiveaza valoarea specificata prin value la adresa din offset.
Functia este de fapt un macro si extinde operatia la intreaga linie de cod
Daca nu se include in etapa de preprocesare,sau daca se anuleaza
cu #undef poke(),functia poate fi utilizata ca si o functie banala.
Functia nu returneaza nici o valoare (nu este depanabila).
EXEMPLU: #include
#include
char *text="a";
int x,y;
main()
{ for (x=1;x<10;x++)
{ poke(FP_SEG(text),FP_OFF(text),x);
y=peek(FP_SEG(text),FP_OFF(text));
printf("Adresa contine valoarea: %d \n",y);
sleep(1);
};
}
ATENTIE: Nu utilizati functia poke() la intamplare,deoarece, daca scrieti
date in segmentul de program,riscati sa defectati sistemul de operare !
-344- [ dos.h-pokeb() si randbrd() ]
FUNCTIA pokeb()
-arhiveaza un byte la adresa specificata
SINTAXA GENERALA este:
void pokeb(unsigned segment,unsigned offset,char value);
Functia arhiveaza la adresa specificata prin segment:offset,valoarea
byte-ului specificata prin value(scrie un byte la adresa respectiva).
Functia este de fapr un macro si poate fi dereferita cu #undef pokeb()
in etapa de preprocesare sau prin omiterea filei antet ,caz in
care va putea fi definita si utilizata ca o functie user oarecare.
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
char *text="a1",y;
int x;
main()
( for (x=65;x<75;x++)
{ pokeb(PF_SEG(text),FP_OFF(text),x);
y=peek(FP_SEG(text),FP_OFF(text));
printf("Adresa contine valoarea: %c \n",y);
sleep(1);
};
}
Atentie maxima atunci cand specificati adresa la care vor fi scrise datele
Orice eroare poate determina stergerea sau alterarea unor date importante.
FUNCTIA randbrd()
-citeste un numar de inregistrari din fisier folosind structura fcb
(FCB=file control bloc).
SINTAXA GENERALA este: int randbrd(struct fcb *fcb,int rcnt);
Functia citeste numarul de inregistrari specificat prin rcnt utilizand
structura de tip fcb spre care pointeaza *fcb(utilizeaza un pointer spre
structura in care este arhivat blocul de control al filei pentru a accesa
din campul de date random).Numarul de inregistrari preluate va fi citit
in memorie la adresa curenta de transfer a datelor(returnata de getdta() )
Functia se executa prin apelul functiei DOS 0x27.Numarul actual de inre-
gistrari citite poate fi determinat prin evaluarea campului de date random
din structura de tip fcb.Cu fiecre intrgistrare citita,valoarea arhivata
in campul de date random este incrementata cu unu(reflecta nr de inregis-
trari citite=actualizare).
In functie de rezultatul evaluarii campului random,functia returneaza una
dintre urmatoarele valori:
0 -toate inregistrarile din fisier au fost citite
1 -s-au citit toate inregistrarile si este sfarsitul filei(EOF)
2 -inregistrarile citite sunt grupate in jurul adresei 0xFFFF
(adica s-au citit atat de multe inregistrari cat a fost posibil
in limita memoriei,dar nu toate)
3 -s-a ajuns la sfarsitul fisierului(EOF) fara sa se fi citit
numarul specificat de inregistrari
Functia este foarte utila pentru operatii de preluare selectiva a unor
date din fisiere,pentru evaluarea fisierelor sau pentru scrierea unor
algoritmi de citire automata a datelor din fisiere.
-345- [ dos.h - randbwr() ]
EXEMPLU: #include
#include
char far *salvare;
char tampon[256];
struct fcb bloc;
int i,rezultat;
main()
{ parsfnm("C:TEXT.TXT",&bloc,1);
bdosptr(0x0F,&bloc,0);
salvare=getdta();
setdta(tampon);
bloc.fcb_recsize=128;
bloc.fcb_random=0L;
rezultat=randbrd(&bloc,40);
printf("rezultat=%d \n",rezultat);
if (rezultat <2)
printf("Au fost citite toate inregistrarile ! \n");
else
printf("Citirea inregistrarilor este incompleta !\n");
for (i=0;i<40;i++)
putchar(tampon[i]);
printf("Fila are: %d octeti \n",bloc.fcb_filsize);
printf("si contine: %d inregistrari \n",bloc.fcb_recsize);
printf("s-au citit: %d inregistrari \n",bloc.fcb_random);
setdta(salvare);
flushall();
sleep(3);
exit(1);
}
In exemplul de mai sus am utilizat fila TEXT1.TXT care a fost creata,s-a
arhivat un text oarecare si apoi a fost mutata in directorul C (pentru a
fi mai usor de analizat cu parsfnm() ).Fila a fost deschisa utilizand o
functie dos apelata cu bdosptr.Incercati sa deschideti o fila(un fisier
oarecare din directorul TC si sa cititi un numar de inregistrari,pentru
ca apoi sa puteti determina blocul de control al filei (FCB)(structura
de tip fcb este definita in -vezi tipurile de date ).
FUNCTIA randbwr()
-scrie un numar de inregistrari pe disc,utilizand structura de tip fcb
SINTAXA GENERALA este: int randbwr(struct fcb *fcb,int rcnt);
Functia scrie pe disc numarul de inregistrari specificat prin rcnt.Pentru
executie,functia apeleaza apelul DOS 0x28 si utilizeaza blocul de control
al filei(structura de tip fcb).Daca numarul specificat prin rcnt este 0,
fila va fi trunchiata la lungimea indicata de campul de date random din
structura fcb.Numarul actual de inregistrari care au fost scrise poate fi
determinat prin evaluarea campului de date random din structura fcb.Cu
fiecare inregistrare adaugata,valoarea din fcb_random este incrementata.
Functia returneaza: 0 -daca s-au scris toate inregistrarile specificate
1- daca nu exista suficient spatiu (nu se scrie nici o inregistrare)
2- daca datele sunt grupate in jurul adresei 0xFFFF (s-au scris atat
de multe cate au incaput in limita memoriei disponibile).
-346- [ dos.h-segread() si setblock() ]
EXEMPLU: #include
#include
char far *salvare;
char tampon[256];
struct fcb bloc;
int i,rezultat;
main()
{ parsfnm("C:TEXT2.TXT",&bloc,1);
bdosptr(0x0F,&bloc,0);
salvare=getdta();
setdta(tampon);
rezultat=randbwr(&bloc,40);
printf("rezultat= %d \n",rezultat);
printf("Fila are: %d octeti \n,bloc.fcb_filesize);
printf("si contine: %d inregistrari \n",bloc.fcb_recsize);
setdta(salvare);
sleep(3);
exit(1);
}
In exemplul de mai sus am creat fila TEXT2.TXT(cu creat()) am arhivat fila
in unitatea C,am preluat calea de acces cu parsfnm() si am deschis fila
cu bdosprt().Incercati sa utilizati structura de tip fcb pantru a scrie
intr-o fila (specificati fcb_drive,fcb_name si fcb_ext ).
FUNCTIA segread()
-citeste registrii pentru segmente
SINTAXA GENERALA este: void segread(struct SREGS *segp);
Functia utilizeaza o structura de tip SREGS(definita in dos.h-vezi tipu-
rile de date dos) pentru a citi si arhiva valoarea curenta a registrilor
destinati pentru segmente (registrii memoriei de procesor 8086).Aceasta
functie este destinata mai ales pentru a fi utilizata impreuna cu functii-
le intdosx() si int86x.
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
struct SREGS segmente;
main()
{ segread(&segmente);
printf("Registrii pentru segmente sunt: \n");
printf("CS: %X DS: %X \n",segmente.cs,segmente.ds);
printf("ES: %X SS: %X \n",segmente.es,segmente.ss);
sleep(3);
}
FUNCTIA setblock()
-modifica dimensiunea unui bloc de memorie alocat anterior
SINTAXA GENERALA este: int setblock(unsigned segx,unsigned newsize);
Functia redimensioneaza blocurile alocate cu allocmem la noua dimensiune
specificata prin newsize.
Functia returneaza -1 in caz de succes,sau in caz de eroare returneaza
dimensiunea maxima posibila pentru bloc si seteaza _doserrno().
-347- [ dos.h-setcbrk() si setdate() ]
EXEMPLU: #include
#include
unsigned int tampon;
unsigned adresa,rezultat;
main()
{ tampon=1;
adresa=allocmem(16,&tampon);
printf("bloc= %x \n",FP_OFF(tampon));
rezultat=setblock(tampon,8);
printf("rezultat= %d \n",rezultat);
perror("");
freemem(tampon);
sleep(3);
}
FUNCTIA setcbrk()
-seteaza controlul intreruperilor
SINTAXA GENERALA este: int setcbrk(int cbrkvalue);
Functia apeleaza DOS 0x33 pentru a seta ON sau OFF controlul intreruperi-
lor.Daca valoarea specificata prin cbrkvalue este 0,controlul intreruperi-
lor va fi setat OFF (adica se va efectua controlul intreruperilor doar
pentru operatiile de intrare/iesire a datelor la consola,imprimanta sau
unitatile de comunicatie-porturile de I/O).Daca valoarea specificata prin
cbrkvalue este 1,controlul intreruperilor va fi setat ON (adica se va
efectua controlul automat,la fiecare apel catre sistem).
Functia returneaza valoarea setata (zero sau unu).
EXEMPLU: #include
#include
int a;
main()
{ a=setcbrk(getcbrk());
if (a==0)
printf("Controlul intreruperilor este setat OFF ! \n");
else
printf("Controlul intreruperilor este setat ON! \n");
sleep(3);
}
Exemplul de mai sus,reseteaza controlul la valoarea initiala.In functie
de rezultatul returnat,puteti utiliza setcbrk(0) sau setcbrk(1).
FUNCTIA setdate()
-seteaza data sistemului
SINTAXA GENERALA este: void setdate(struct date *datep);
Functia utilizeaza o structura de tip date (definita in dos.h) spre care
este orientat pointerul *datep,pentru a seta data sistemului(ziua,luna si
Dostları ilə paylaş: |
|
|