Limbajul c si C++ abc-doar


reastra MS-DOS in care ruleaza programul si apoi relansati TC.exe



Yüklə 4,6 Mb.
səhifə45/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   41   42   43   44   45   46   47   48   ...   55

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

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   41   42   43   44   45   46   47   48   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin