Limbajul c si C++ abc-doar


decat 255,puteti utiliza tipul unsigned de data specificand astfel



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

decat 255,puteti utiliza tipul unsigned de data specificand astfel:

__emit__(0xB8,(unsigned)17); sau

__emit__(0xB8,17u);

La nevoie se pot forta si adrese de 2 sau 4 bytes prin apelarea acesteia

cu void near* sau respectiv void far*

Functia nu returneaza valori si nu este depanabila.

EXEMPLU: #include

#include

int x;

main()

{ printf("TESTARE IMPRIMANTA IN MOD TEXT \n");

for (x=1;x<15;x++);

printf("%d ...randul cu numarul: %d \n",x,x);

__emit__(0xcd,0x05);

sleep(3);

}

Exercitiul apelaza direct imprimanta.Verificati daca imprimanta este pre-

gatita pentru scriere,inainte de a lansa exercitiul.
FUNCTIA FP_OFF()

-citeste offset-ul unei adrese sau al unui segment(sfarsitul adresei).

SINTAXA GENERALA este: unsigned FP_OFF(void far *p);

Functia citeste adresa far (indepartata) a unei adrese sau a unui segment.

FP_OFF este un macro care citeste sau seteaza pointerul *p.

Functia returneaza o valoare de tip unsigned care reprezinta offset-ul.

Functia se utilizeaza pentru a delimita in memorie o variabila sau o con-

stanta.Este foarte utila mai ales in cazul tablourilor bi sau tridimen-

sionale si pentru operatiile de depanare a memorei.


-325- [ dos.h- FP_SEG() si freemem() ]

EXEMPLU: #include

#include

float date[5];

main()

{ date[1]=1.14;

date[2]=23.14;

date[3]=77.5;

printf("adresa pentru date[] este: \n");

printf("%x segmentul= %x \n",FP_SEG(&date),FP_OFF(&date));

printf("adresa pentru date[1] este: \n");

printf("%x segmentul= %x \n",FP_SEG(&date[1]),FP_OFF(&date[1]));

printf("adresa pentru date[2] este: \n");

printf("%x segmentul %x \n",FP_SEG(&date[2]),FP_OFF(&date[2]));

printf("adresa pentru date[3] este: \n");

printf("%x segmentul= %x \n",FP_SEG(&date[3]),FP_OFF(&date[3]));

getch(); }
FUNCTIA FP_SEG()

-determina adresa unei date sau al unui segment (valoarea segmentului)

SINTAXA GENERALA este: unsigned FP_SEG(void *p);

Functia determina inceputul adresei.Este un macro care determina sau

seteaza valoarea pointerului *p.

Functia returneaza o valoare unsigned reprezentand valoarea segmentului.

EXEMPLU: #include

#include

char *nume="Microsoft Cluj-Napoca \n";

main()

{ printf("Numele este: %s \n",nume);

printf("Adresa pointata este:\n");

printf("%x la %x \n",FP_SEG(nume),FP_OFF(nume)+FP_SEG(nume));

printf("Adresa de arhivare este: \n");

printf("%x la %x \n",FP_SEG(&nume),FP_OFF(&nume)+FP_SEG(&nume));

getch(); }

Valoarea segmentului de memorie ocupata cu date este determinata de tipul

de date (respectiv 1,2,4,8 sau 10 bytes/data)
FUNCTIA freemem()

-elibereaza blocurile de memorie alocate anterior cu allocmem()

SINTAXA GENERALA este: int freemem(unsigned segx);

Functia elibereaza memoria alocata anterior pentru segmentul specificat

prin segx (cu ajutorul functiei allocmem() ).Se utilizeaza pentru a eli-

bera memoria,ori de cate ori este posibil (atunci cand adresa respectiva

nu va mai fi apelata in cursul executiei programului).Eliberarea memoriei

determina cresterea vitezei de executie si permite realocarea de blocuri

noi de memorie,pentru alte scopuri.

Functia returneaza 0 in caz de succes sau -1 si seteaza errno in caz de

insucces.

Pentru a evita suprasolicitarea memoriei de operare,este bine sa nu

abuzati de functiile care aloca memorie,sa tineti o evidenta stricta a

blocurilor de memorie alocata si sa eliberati memoria cand este posibil.

EXEMPLU: vezi functia allocmem()


-326- [ dos.h - geninterrupt() ]

FUNCTIA geninterrupt(int intr_num);

-genereaza o intrerupere software

SINTAXA GENERALA este: void geninterrupt(int intr_num);

Este un macro,care declanseaza un nivel de intrerupere specificat prin

intr-num.Dupa fiecare apel al unui nivel de intrerupere,statusul registri-

lor depinde de tipul intreruperii solicitate.Intreruperile pot lasa re-

gistrii cu un status greu de anticipat (nu apelati nivelurile de intre-

rupere decat daca stiti exact ce doriti sa obtineti si care va fi rezul-

tatul actiunii asupra datelor).

Nivelurile de intrerupere software,reprezinta modalitatea de comunicare

dintre structurile software si cele de hardware.Practic,se utilizeaza

pentru a solicita date de la unitatile de executie,sau pentru a transmite

comenzi executabile (in cod masina).Nu se recomanda apelarea lor de catre

incepatori,deoarece,desi sunt foarte rapide si eficiente,pot genera o

serie intreaga de incompatibilitati ale structurilor de date ce urmeaza

sa fie prelucrate in urma intreruperii (registrii pot contine valori care

vor afecta executia viitoare a programului-daca nu au fost resetati).

Functia nu returneaza nici o valoare (nu este depanabila).

EXEMPLU 1: #include

#include

int x;

main()

{ geninterrupt(0x10);

printf("Schimbare mod ecran ! \n");

sleep(3);

}

EXEMPLU 2: #include

#include

int x;

struct text_info ti;

main()

{ for (x=1;x<7;x++)

{ clrscr();

sleep(1);

gotoxy(40,15);

scrie('M');

sleep(1);

};

return 0;

}

scrie(char ch)

{ gettextinfo(&ti); /*citeste setarile textului */

_AH=9; /*subfunctia de intrerupere */

_AL=ch; /*caracterul scris */

_BH=0; /*pagina video */

_BL=ti.attribute; /*atributul video */

_CX=3; /*bucla de repetitie */

geninterrupt(0x10); /*afiseaza caracterul */

}

Exercitiul utilizeaza limbajul de asamblare,pentru setarea registrilor.

-327- [ dos.h -getcbrk() si getcwd() ]

FUNCTIA getcbrk()

-verifica setarea pentru controlul intreruperilor

SINTAXA GENERALA este: int getcbrk(void);

Functia apeleaza nivelul de intrerupere DOS 0x33,pentru a returna setarea

controlului intreruperilor.Daca este setat ON,controlul se face la fiecare

apel al sistemului,iar daca este setat OFF,controlul se face doar in mo-

mentul operatiilor I/O de la consola,imprimanta sau porturi de comunicatie

Functia returneaza 0 daca setarea este OFF sau 1 daca setarea este ON.

EXEMPLU: #include

#include

int status;

main()

{

status=getcbrk();

if (status==1)

printf("Controlul intreruperilor DOS este setat ON \n");

if (status==0)

printf("Controlul intreruperilor este setat OFF \n");

else

perror("Eroarea este: ");

sleep(3);

}

Setarea si resetarea controlului intreruperilor se face cu setcbrk() si

este utilizata pentru diferite tehnici de programare,sau pentru depanarea

programelor si aplicatiilor (se verifica initial daca eroarea este gene-

rata de intreruperile software si apoi se verifica fiecare intrerupere,

pas cu pas).
FUNCTIA getcwd()

-determina directorul curent

SINTAXA GENERALA este: char *getcwd(char *buf,int buflen);

Functia determina directorul curent si returneaza un pointer spre tamponul

de memorie specificat prin buf.Tamponul trebuie sa fie de o lungine cores-

punzatoare,iar calea de acces va fi preluata pana la lungimea de buflen

caractere.

Functia are prototipul in fila antet si este extrem de mult

utilizata pentru rutinele de transfer automat al datelor dintr-un director

in altul.

Functia returneaza un pointer spre buf,sau NULL in caz de eroare si se-

teaza variabila globala errno la un mesaj de eroare.

EXEMPLU: #include

#include

char director[80];

main()

{

getcwd(director,75);

printf("Directorul curent este: %s \n",director);

sleep(3);

}

Functia este foarte utila si pentru depanarea aplicatiilor,atunci cand

deschideti multiple fisiere,de pe unitati de memorie diferite.


-328- [ dos.h -getdate() si getdfree() ]

FUNCTIA getdate()

-arhiveaza data calendaristica intr-o structura de tip date

SINTAXA GENERALA este: void getdate(struct date *datep);

Se utilizeaza pentru a prelua data calendaristica,sau pentru a reseta sau

schimba data sistemului cu functia setdate().

Datele se preiau si se arhiveaza intr-o structura de tip date,care are

forma generala:

struct date{ int da_year; /*anul */

char da_day; /*ziua */

char da_mon; /*luna (1=Ianuarie...etc)*/

}

Limbajul C++ accepa functia _dos_getdate,care este similara,dar arhiveaza

datele intr-o structura de tip dosdate_t care are forma generala:

struct dosdate_t { unsigned char day; /* 1-31 */

unsigned char month; /* 1-12 */

unsigned int year; /* 1980-2099 */

unsigned char dayofweek; /* 0-6 (0=Sunday) */

Functia nu returneaza nici o valoare.

EXEMPLU: #include

#include

struct date d;

main()

{ getdate(&d);

printf(" %d / %d / %d \n",d.da_day,d.da_mon,d.da_year);

sleep(3);

}
FUNCTIA getdfree()

-returneaza spatiul liber de pe unitatea de memorie

SINTAXA GENERALA este: void getdfree(unsigned char drive,struct dfree *d);

Functia citeste unitatea de disc specificata prin drive,si arhiveaza date-

le intr-o structura de tip dfree,spre care este orientat pointerul *p.

Unitatea se specifica prin 0=default,1=A,2=B,3=C etc.Structura de tip

dfree are urmatoarea forma generala:

struct dfree { unsigned df_avail; /*clustere libere */

unsigned df_total; /*total clustere */

unsigned df_bsec; /*bytes per sector */

unsigned df_sclus; /*sectoare per cluster */

Functia nu returneaza valori.In caz de eroare df_sclus va returna -1.

EXEMPLU: #include /*introduceti o discheta ! */

#include

struct dfree disc;

main()

{ getdfree(1,&disc);

printf("Discheta are: %d clustere libere \n",disc.df_avail);

printf("din totalul de: %d clustere \n",disc.df_total);

printf("contine: %d bytes per sector \n",disc.df_bsec);

printf("si: %d sectoare per cluster \n",disc.df_sclus);

sleep(5);

}

Clusterele si sectoarele sunt blocuri din memoria stiva(depind de format).


-329- [ dos.h -getdta() si getfat() ]

FUNCTIA getdta()

-citeste adresa de transfer

SINTAXA GENERALA este: char far *getdta(void);

Functia citeste si returneaza adresa implicita utilizata pentru transfe-

rul datelor.In versiunile de C si C++ cu modele mici si medii de memorie,

rezultatul returnat va fi intotdeauna adresa implicita de transfer al

datelor,dar daca utilizati si rutine scrise in limbaj de asamblare,atunci

adresa de transfer a datelor poate fi directionata spre orice adresa de

hardware (de exemplu,mesajele e-mail pot fi directionate spre discheta in

loc de harddisk,pentru a evita eventualii "virusi informatici").

Pentru modelele compacte si cele cu memorie extinsa,adresa returnata

este intotdeauna adresa reala si poate fi localizata si in afara progra-

mului (pe o unitate externa,in memoria de RAM etc.).

Functia returneaza un pointer far spre adresa de transfer.

EXEMPLU: #include

#include

char far *adresa;

main()

{ adresa=getdta();

printf("Adresa curenta de transfer este: %Fp \n",adresa);

sleep(3);

}
FUNCTIA getfat()

-citeste tabela de alocare a filei

SINTAXA GENERALA este: void getfat(char drive,struct fatinfo *dtable);

Functia citeste tabela de alocare a datelor (FAT) si arhiveaza informa-

tiile preluate intr-o structura de tip fatinfo precizata prin dtable.

Unitatea de memorie(disc) se va specifica prin 0=default,1=A,2=B,3=C etc.

Structura fatinfo are forma generala:

struct fatinfo { char fi_sclus; /* sectoare per cluster */

char fi_fatid; /* btye de identificare */

unsigned fi_nclus; /*numar de clustere */

int fi_bysec; /*bytes per sector */

Functia nu returneaza valori (nu este depanabila automat).

EXEMPLU: #include

#include

struct fatinfo alocare;

main()

{ getfat(1,&alocare);

printf("Numar sectoare/cluster= %d \n",alocare.fi_sclus);

printf("Byte pentru identificare=%d \n",alocare.fi_fatid);

printf("Numar clustere= %d \n",alocare.fi_nclus);

printf("Bytes per sector= %d \n",alocare.fi_bysec);

sleep(3);

}

Bitul de identificare .fi_fatid returneaza tipul de discheta astfel:

0xFD pentru 350 K low density,0xF9 pentru 1.2 M high density sau default

daca discheta este neformatata.

Functia este utila,pentru a calcula volumul total de memorie al unitatii

respective,pentru a identifica tipul de format sau unitatea activa,etc.


-330- [ dos.h -getfatd() si getftime() ]

FUNCTIA getfatd()

-citeste tabela de alocare a filei (pentru unitatea implicita)

SINTAXA GENERALA este: void getfatd(struct fatinfo *dtable);

Functia este identica cu getfat() cu exceptia faptului ca citeste datele

doar pentru unitatea de disc implicita (nu se specifica unitatea de disc).

Utilizeaza tot o structura de tip fatinfo pentru arhivarea datelor.

EXEMPLU: #include

#include

struct fatinfo alocare;

main()

{ getfatd(&alocare);

printf("Nr.sectoare/cluster= %d \n",alocare.fi_sclus);

printf("Byte pt. identificare= %x \n",alocare.fi_fatid);

printf("Nr. clustere= %d \n",alocare.fi_nclus);

printf("Bytes/sector= %d \n",alocare.fi_bysec);

sleep(3);

}
FUNCTIA getftime()

-citeste data si ora la care a fost arhivata o fila oarecare

SINTAXA GENERALA este: int gettime(int handle,struct ftime *ftimep);

Functia citeste si arhiveaza in structura de tip ftime specificata prin

pointerul ftimep informatiile despre data si ora filei (la care a fost

creata sau resetata).Pentru identificarea filei se utilizeaza numarul de

manipulare interna handle,generat de functia care a deschis fila (fopen())

Structura de tip ftime are forma generala:

struct ftime { unsigned ft_tsec: 5; /*cate doua secunde */

unsigned ft_min: 6; /* minute */

unsigned ft_hour: 5; /*ore */

unsigned ft_day: 5; /*zile */

unsigned ft_month: 4; /*luni */

unsigned ft_year: 7; /*an -1980 */ };

Functia returneaza 0 in caz de succes sau -1 in caz de esec(seteaza errno)

EXEMPLU: #include

#include

#include

int handle;

FILE *p;

struct ftime t;

main()

{ p=fopen("tlib.exe","r");

handle=fileno(p);

getftime(handle,&t);

printf("Fila tlib.exe a fost creata la: \n");

printf("%u %u %u \n",t.ft_hour,t.ft_min,t.ft_sec*2);

printf("la data de: \n");

printf(" %u %u %u \n",t.ft_day,t.ft_month,t.ft_year+1980);

getch();

}

Functia se poate utiliza pentru a calcula intervalul de timp de la ultima

actualizare,pentru a selecta filele in functie de data,etc.


-331- [dos.h-getpsp() si gettime() ]

FUNCTIA getpsp()

-citeste prefixul segmentului de program

SINTAXA GENERALA este: unsigned getpsp(void);

Functia utilizeaza apelul DOS 0x62 pentru a determina adresa segmentului

de memorie ocupat de program(o parte din memoria rezervata pentru Turbo C,

este ocupata de program,iar restul este destinat apicatiilor si fisierelor

generate de utilizator).

Functia returneaza adresa prefixului pentru segmentul de program.

EXEMPLU: #include

#include

unsigned adresa;

( adresa=getpsp();

printf("Segmentul de memorie rezervat programului este de: \n");

printf(" %u linii de adresa \n",adresa);

sleep(3);

}
FUNCTIA gettime()

-citeste ora (timpul) sistemului

SINTAXA GENERALA este: void gettime(struct time *timep);

Functia citeste timpul sistemului si arhiveaza datele intr-o structura de

tip time,spre care este orientat pointerul specificat prin timep.

Structura de tip time are urmatoarea forma generala:

struct time { unsigned char ti_min; /*minute */

unsigned char ti_hour; /*ore */

unsigned char ti_sec; /*secunde */

unsigned char ti_hund; /*sutimi */ };

Functia nu returneaza valori.

EXEMPLU: #include

#include

#include

struct time t;

main()

{ textcolor(14);

textbackground(12);

gettime(&t);

cprintf("\nEste ora: %d-%d-%d \n",t.ti_hour,t.ti_min,t.ti_sec);

cprimtf("si %d sutimi de secunda \n",t.ti_hund);

sleep(3);

}

Incercati sa utilizati functia in mod grafic,pentru a realiza un ceas cu

aratatoare si secundar (ca cel din Windows),sau pentru a realiza un scurt

desen animat.Functia se utilizeaza in mod frecvent si pentru derularea

textului in liniile de teletext sau pentru initializarea samantei de

start pentru generarea de numere aleatoare (vezi si randomize).

Functia se poate utiliza si pentru realizarea unor secvente de

comenzi sau a unor algoritmi de calcul,care utilizeaza ceasul sistemului

pentru ordonarea unor secvente de comenzi (de exemplu pentru a afisa

mesaje sau popup-uri,pentru a cronometra timpul de executie,pentru a de-

termina viteza de executie,pentru a lansa aplicatii la o anumita ora etc.

Resetarea frecventa a ceasului poate genera uneori erori ale memoriei RAM!


-332- [ dos.h -getvect() si getverify() ]

FUNCTIA getvect()

-citeste vectorul unui nivel de intrerupere

SINTAXA GENERALA este: void interrupt(*getvect(int interruptno)) ();

Functia citeste adresa de locatie a unui nivel de intrerupere (formata din

4 bytes).Orice procesor din familia 8086 include un set de 255 de vectori

care contin adresa de locatie a cate unui nivel de intrerupere (functie de

intrerupere).Prin nivel de intrerupere se intelege un punct din program

in care executia linie cu linie a programului este intrerupta si se trans-

fera executia spre o anumita adresa de memorie sau spre o anumita functie

arhivata in memorie.Vectorii de interupere se utilizeaza pentru a facilita

accesul cat mai rapid la memorie.Nivelul de intrerupere specificat prin

interruptno poate lua valori intre 0 si 255.

Functia returneaza valoarea vectorului (adresa de 4 bytes HEX)(de tip int)


Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   39   40   41   42   43   44   45   46   ...   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