xBB Undefined error occured Eroare nedefinita
səhifə 51/55 tarix 07.05.2018 ölçüsü 4,6 Mb. #50260
0xBB Undefined error occured Eroare nedefinita
0xCC Write fault occured Eroare la scriere
0xE0 Status error Eroare de status
0xFF Sense operation failed Operatie nereusita
Functia returneaza valoarea registrului AX setata de apelul INT 0x13 BIOS.
EXEMPLU: #include
#include
#include
char *date;
unsigned int nr;
main()
{ nr=biosdisk(2,0,1,1,20,1,&date);
printf(%u \n",nr);
if (nr & 0x0A)
printf("Sector defect !");
else
printf("Sector citit corect !");
sleep(3);
}
Pentru executie introduceti o discheta.Nu se recomanda incepatorilor.
-388- [ bios.h - biosequip() ]
FUNCTIA biosequip()
-verifica echipamentul
SINTAXA GENERALA este: int biosequip(void);
Functia apeleaza intreruperea BIOS 0x11 pentru a returna o valoare de
tip int care descrie codificat echipamentul conectat.
Valoarea returnata este de tip int pe 16 biti(2 octeti) si poate fi in-
terpretata dupa cum urmeaza:
biti 14-15 nr de imprimante pe port paralel (00=niciuna,01=1,10=2,11=3)
bit 13 imprimanta atasata pe port serial
bit 12 adaptor pentru jocuri (placa I/O)
bit 9-11 numarul de porturi de comunicatie COM ( 000=0,001=1,010=2,
011=3,100=4,101=5,110=6,11=7) adica maxim 8 porturi COM
bit 8 DMA(memoria cu acces direct) (0=exista DMA 1=nu exista DMA)
bit 6-7 Numar de unitati de memorie( 00=1,01=2,10=3,11=4)
bit 4-5 Modul video initial (00=nefolosit 01=40x25 BW 10=80x25BW
11=80x25 BW monocrom)
bit 2-3 Memoria de RAM (00=16K 01=32K 10=48K 11=64K )
bit 1 coprocesorul matematic in virgula mobila
bit 0 bootare(pornire) de pe disc
Functia se utilizeaza pentru detectarea hard-ului instalat.
EXEMPLU: #include
#include
#include
int nr;
#define CO_PROCESSOR 0x002
#define RAM16 0x0001
#define RAM32 0x0012
#define RAM64 0x0112
main()
{ nr=biosequip();
printf("Codul pentru echipamentul instalat este: %d \n",nr);
if (nr & CO_PROCESSOR)
printf("Coprocesorul matematic este instalat ! \n");
else
printf("Nu exista coprocesor matematic ! \n");
if (nr & RAM16)
printf("Placa de baza are 16 K de RAM \n");
if (nr & RAM32)
printf("Placa de baza are 32 K de RAM \n");
if (nr & RAM64)
printf("Placa de baza are 64 K de RAM \");
sleep(3);
}
Calculatoarele moderne au mai mult de 64 K de RAM,astfel incat toate
cele trei optiuni vor fi pozitive.Incercati sa scrieti un program care
sa testeze secvential memoria de RAM sau numarul de porturi COM.)
Functia nu reseteaza niciuna dintre valorile returnate,astfel incat poate
fi utilizata si de catre incepatori,fara nici un risc.Functiile care
scriu direct in BIOS pot modifica radical parametrii de lucru ai sis-
temului de operare ,pot sterge unitatile instalate sau pot reformata discul
determinand uneori erori irecuperabile.
-389- [ bios.h-bioskey() si biosmemory()]
FUNCTIA bioskey()
-executa diverse operatii cu tastatura utilizand intreruperea BIOS 0x16
SINTAXA GENERALA este: int bioskey(int cmd);
Functia executa diverse operatii pentru tasatura.Operatia executata este
determinata de comanda specificata prin cmd.
Functia returneaza o valoare de tip int determinata de operatia executata
Comanda specificata prin cmd poate fi:
0 -daca bitii din octetul inferior sunt nonzero,functia returneaza
codul ASCII pentru caracterul aflat pe linie de asteptare,sau
ultima tasta apasata de la tastatura.Daca bitii din octetul infe-
rior sunt zero,bitii din octetul superior(8-15) sunt expandati la
codul extins al tastaturii,conform cu standardul IBM-PC.
1 -testeaza daca o anumita tasta poate fi citita.Daca functia retur-
neaza zero inseamna ca nici o tasta nu este disponibila.Daca functia
returneaza -1 (0xFFFFF) inseamna ca este apasata combinatia de taste
Ctrl-Brk.In orice alta situatie se returneaza valoarea ultimei taste
apasate,care urmeaza sa fie executata la proxima apelare a functiei
bioskey().
2 -solicita statusul actual al tastelor de control.Valoarea poate fi:
bit 7 0x80 Insert on
bit 6 0x40 Caps on
bit 5 0x20 Num Lock on
bit 4 0x10 Scroll Lock on
bit 3 0x08 Alt este apasata
bit 2 0x04 Ctrl este apasata
bit 1 0x02 Left arrow si Shift sunt apasate
bit 0 0x01 Right arrow si Shift sunt apasate
Functia se utilizeaza pentru a verifica sau seta tastele de control.
EXEMPLU: #include
#include
#include
int nr;
#define Scroll 0x0010
main()
{ nr=bioskey(2);
printf("Codul pentru tastele de control= %d \n",nr);
if (nr & Scroll)
printf("Tasta Scroll Lock este ON ! \n");
else
printf("Tasta Scroll Lock este OFF ! \n");
sleep(3);
}
FUNCTIA biosmemory()
-returneaza dimensiunea memoriei de RAM
SINTAXA GENERALA este: int biosmemory(void);
Functia apeleaza intreruperea BIOS 0x12 pentru a returna dimensiunea
memoriei de RAM instalate(fara a include memoria extinsa,memoria expandata
sau memoria adaptorului pentru afisaj,placa grafica etc.).
Functia returneaza dimensiunea memoriei de RAM in blocuri de 1 K (maxim
pana la 640 K ).
-390- [ bios.h - biosprint() ]
EXEMPLU: #include
#include
#include
int nr;
main()
{ nr=biosmemory();
printf("Memoria de RAM instalata este: %d K \n",nr);
sleep(3);
}
FUNCTIA biosprint()
-efectueaza operatii asupra imprimantei identificate
SINTAXA GENERALA este: int biosprint(int cmd,int abyte,int port);
Functia apeleaza intreruperea BIOS 0x17 pentru a executa diferite operatii
asupra imprimantei instalate (identificata pe portul specificat prin port)
Valaorea 0 pentru port corespunde pentru LPT1,valoarea 1 corespunde pentru
LPT2 etc.
Comanda specificata prin cmd poate fi:
0 imprima caracterul specificat prin abyte
1 initializeaza portul imprimantei
2 citeste statutul imprimantei
Valoarea pentru abyte poate fi intre 0 si 255 (cod numeric ASCII).
Valoarea returnata de oricare dintre operatiile efectuate este corespun-
zatoare cu statusul imprimantei (obtinut de catre ORing-adica de catre
bucla de control) si poate fi una dintre urmatoarele valori:
bit 0 0x01 Device time out unitate nefunctionala
bit 3 0x08 I/O error eroare de intrare/iesire
bit 4 0x10 Selected unitatea este selectata
bit 5 0x20 Out of paper imprimanta nu are hartie
bit 6 0x40 Acknowledge semnalizare de avertizare
bit 7 0x80 Not busy nu este in lucru
EXEMPLU: #include
#include
#include
int status;
main()
{ status=biosprint(2,0,2);
if (status & 0x01)
printf("imprimanta nu este conectata ! \n");
if (status & 0x08)
printf("Eroare I/O (intrare-iesire)! \n");
if (status & 0x10)
printf("Imprimanta este selectata ! \n");
if (status & 0x20)
printf("Nu este hartie ! \n");
if (status & 0x40)
printf("Semnalizare ! \n");
if (status & 0x80)
printf("Imprimanta nu este in lucru ! \n");
sleep(3);
}
-391- [ bios.h -biostime() ]
FUNCTIA biostime()
-citeste sau seteaza ceasul BIOS-ului
SINTAXA GENERALA este: long biostime(int cmd,long newtime)
Functia citeste sau reseteaza valoarea ceasului de BIOS care numara im-
pulsurile care au rezultat incepand cu miezul noptii si pana in momentul
respectiv,la o rata a impulsurilor egala cu cea setata in constanta
CLK_TCK declarata in time.h (respectiv _BIOS_CLK_TCK in versiunea C++).
Pentru executie,functia apeleaza intreruperea BIOS 0x1A.
Daca cmd este 0,functia returneaza valoarea actuala a timerului iar daca
cmd este 1,ceasul (timerul) va fi resetat la valoarea specificata prin
newtime.
Functia returneaza valoarea actuala (numarul de impulsuri de la ora 0.00)
EXEMPLU: #include
#include
#include
#include
long timp;
main()
{ timp=biostime(0,0);
printf("De la miezul noptii au trecut: \n");
printf("%lu impulsuri=batai de ceas (CLK_TCK): \n",timp);
printf("adica %lu secunde \n",timp/18);
printf("adica %lu minute \n",timp/1080);
printf("adica %lu ore \n",timp/64800);
sleep(3);
}
Exercitiul este conceput pentru versiunea Turbo C la care CLK_TCK este
definita cu valoarea 18.2.In versiunea C++,constanta CLK_TCK este definita
cu valoarea de 1000.0 iar exercitiul necesita corectarile de rigoare.
Puteti utiliza si constanta CLK_TCK sau respectiv _BIOS_CLK_TCK).
Functia se poate utiliza in programare pentru a executa anumite operatii
la un moment predefinit al zilei,pentru a cronometra sau controla temporal
executia aplicatiilor sau pentru a efectua intreruperi secventiale dupa
un grafic prestabilit etc.
BIBLIOTECA C fila antet
-defineste constante mnemotehnice pentru codurile de eroare
CONSTANTE,TIPURI DE DATE si VARIABILE GLOBALE
_doserrno este o variabila globala care arhiveaza in paralel cu errno
codurile de eroare identificate de sistemul de operare.Functia perror
nu apeleaza _doserrrno direct ci apleaza errno,care este o variabila
asemanatoare mostenita de la sistemul de operare UNIX.La orice eroare
identificata de sistemul de operare,_doserrno arhiveaza codul mnemo-
tehnic,care poate fi utilizat in procesul de depanare/optimizare.
Pentru informatii suplimentare despre erori si coduri de eroare con-
sultati manualul tehnic al sistemului de operare (DOS).
Prin intermediul variabilei errno ,codul mnemotehnic poate fi extins
uneori la un mesaj complet de eroare prin apelarea sirurilor echivalente
din _sys_errlist.
-392- [ errno.h -errno ]
Codurile mnemotehnice returnate de _doserrno pot fi:
E2BIG Bad environ Mediu de operare gresit
EACCES Access denied Acces interzis
EACCES Bad acces Greseala de acces
EACCES Is curent dir Directorul este cel curent
EBADF Bad handle Cod de manipulare gresit
EFAULT Reserved Rezervat
EINVAL Bad data Data(valoare) gresita
EINVAL Bad function Functie gresita
EMFILE Too many open Prea multe file deschise
ENOENT No such file Nu exista fila sau directorul
or directory
ENOEXEC Bad format Format gresit
ENOMEM Mcb destroyed Bloc de memorie distrus
ENOMEM Out of memory Nu exista suficienta memorie
ENOMEM Bad block Bloc de memorie gresit
EXDEV Bad drive Unitate gresita
EXDEV Not same device Nu este aceeasi unitate
errno -este o variabila globala asemanatoare cu _doserrno utilizata
pentru a arhiva erorile identificate de catre sistemul de operare
si respectiv apelata de catre functia perror() pentru a afisa
mesajele de eroare.Uneori este echivalenta cu _doserror,dar exista
si erori care sunt arhivate in error dar nu si in _doserror.
Are forma generala: extern int errno;
Principalele coduri mnemotehnice din errno sunt:
EZERO Error 0 Eroare zero
EINVFNC Invalid function unmber Numar de functie invalid
ENOFILE File not found Fila nu a fost gasita
ENOPATH Path not found Calea nu a fost gasita
ECONTR Memory blocks destroyed Blocuri de memorie distruse
EINVMEM Invalid memory block address Adresa gresita
EINVENV Invalid enviroment Mediu de operare eronat
EINVFMT Invalid format Format gresit
EINVACC Invalid acces code Cod de acces invalid
EINVDAT Invalid data Data(valoare) gresita
EINVDRV Invalid drive specified Unitate specificata gresit
ECURDIR Atempt to remove Curdir Nu se sterge direct. curent
ENOTSAM Not same device Nu este aceeasi unitate
ENMFILE No more files Nu mai sunt file
ENOENT No such file or directory Nu exista fila sau direct.
ENOMEM Not enough core Insuficienta memorie
EMFILE Too many open files Prea multe file deschise
EACCESS Permision denied Acces interzis
EXDEV Cross-device link Conectare incrucisata
EDOM Math argument Argument matematic
ERANGE Result too large Rezultat prea mare
EFAULT Unknown error Rezultat necunoscut
EBADF Bad file number Numar eronat al filei
EINVAL Invalid argument Argument invalid
E2BIG Arg list too long Prea multe argumente
-393- [ fcntl.h- _pipe() ]
BIBLIOTECA C fila antet
-defineste flag-urile pentru functiile de deschidere a filelor
_fmode -este o variabila globala care determina modul text sau modul
binar de deschiderea a unei file.Accepta valorile O_TEXT si
respectiv O_BINARY.Variabila este setata implicit O_TEXT.
Diferenta intre cele doua moduri consta in modul de interpretare
a caracterelor functionale CR/LF,respectiv in modul de sfarsit
a fiecarui rand(vezi open() ).
O_xxx -sunt constante si definesc argumentele de definitie a filelor
Sunt utilizate pentru functiile: _dos_open,fdopen,fopen,freopen,
_fsopen,open,_rtl_open,sopen.Pot fi:
O_APPEND Adauga date intr-o fila (pointeaza sfarsitul filei)
O_BINARY Deschide fila in mod binar (explicit)
O_CHANGED Deschide fila doar pentru citire (special DOS)
O_CREAT Creaza si deschide fila
O_DENYALL Returneaza eroare pentru open cu O_RDWR
O_DENYNONE Permite accesul concurential
O_DENYREAD Returneaza eroare pentru open cu O_RDONLY,O_RDWR
O_DENYWRITE Returneaza eroare pentru open cu O_WRONLY,O_RDWR
O_DEVICE Deschide fila doar pentru citire (special DOS)
O_EXCL Deschide fila exclusiv (doar cu O_CREAT)
O_NOINHERIT Procesele copil mostenesc fila deschisa
O_RDONLY Deschide fila doar pentru citire
O_RDWR Deschide fila pentru citire si scriere
O_TEXT Deschide fila explicit in mod text
O_TRUNC Deschide fila cu trunchiere
O_WRONLY Deschide fila doar pentru scriere
FUNCTIA _pipe() [ in versiunea C++ declarata in io.h ]
-creaza un canal de comunicatie pentru scriere sau citire
SINTAXA GENERALA este: int _pipe(int *handles,unsigned int size,int mode);
Functia creaza un canal de comunicatie(un fel de stream) care poate fi
utilizat pentru a transfera informatie intre doua procese diferite.Canalul
de comunicatie poate fi scris si citit la fel ca o fila de pe disc,dar nu
are un nume de identificare sau o adresa fixa de stocare (este doar un
tampon volatil de memorie).Dimensiunea tamponului de memorie asociat cu
canalul de comunicatie este cea specificata prin size (se recomanda sa
fie de minimum 512 bytes).Modul de deschidere poate fi O_TEXT sau O_BINARY
(la fel ca pentru file).
FUNCTIA returneaza 0 in caz de succes sau -1 in caz de eroare(+ errno).
EXEMPLU: [ C++] #include
#include
int handles[2],int nr;
main()
{ handles[1]=7;
nr=_pipe(handles,1024,O_TEXT);
printf("nr=%d \n",nr);
getc(stdin);
}
-394- [float.h-_clear87() si _control87()]
BIBLIOTECA C fila antet
-contine parametrii necesari pentru operatiile cu virgula mobila
FUNCTIA _clear87()
-sterge statusul din registrul virgulei mobile (1 word=2 bytes)
SINTAXA GENERALA este: unsigned int _clear97(void);
Functia sterge statusul virgulei mobile,care este rezultatul combinatiei
dintre un word 80x87(2 bytes din coprocesorul matematic) si diferite alte
conditii detectate de catre controler-ul de exceptii al coprocesorului
matematic (80x87).
Functia returneaza valoarea indicata pentru statusul virgulei mobile
inainte de a fi sters.Pentru amanunte despre statusul virgulei mobile
vezi constantele definite in float.h.
EXEMPLU: #include
#include
#include
float x;
double y=1.5e-100;
main()
{
printf("\nStatus 8087 inainte de eroare=%X \n),_status87());
x=y; /*se introduce eroarea de domeniu */
printf("Status 8087 dupa eroare= %X \n",_status87());
_clear87();
printf("Status 8087 dupa clear= %X \n",_status87());
y=x;
sleep(3);
return(0);
}
Inainte de a rula exercitiul verificati daca aveti coprocesor matematic
8087 instalat.(vezi si _status87() )
FUNCTIA _control87()
-manevreaza registrul de control al virgulei mobile (1 word)
SINTAXA GENERALA este:
unsigned int _control87(unsigned int newcw,unsigned int mask);
Functia citeste sau reseteaza statusul virgulei mobile.Statusul virgulei
mobile este un word (2 bites) care contine o valoare de tip unsigned int
reprezentata pe 16 biti(2 bytes) si care specifica bit cu bit un pachet
de informatii ce contin:numele,precizia,modul infinit si modalitatea de
rotunjire a valorilor.Prin schimbarea acestor parametrii,valorile expri-
mate in virgula mobila pot contine sau pot exclude exceptiile precizate
prin domeniul astfel specificat (Exemplu: rotunjirea se poate face spre
valoarea cea mai mare sau spre cea mai mica ,precizia poate fi crescuta
sau scazuta etc.).
La executia functiei,daca valoarea specificata pentru mask este 0,functia
returneaza valoarea pentru registrul virgulei mobile,fara a opera nici o
modificare ( EXEMPLU: _control87(0,0) ).
Daca valoarea specificata pentru mask este 1,atunci fiecare bit din va-
loarea specificata in newcw va inlocui pe cel similar din registrul de
control al virgulai mobile.
-395- [ float.h - _fpreset() ]
EXEMPLU: word initial 0100 0011 0110 0011
mask 1000 0001 0100 1111
newcw 1110 1001 0000 0101
biti modificati 1xxx xxx1 x0xx 0101
Functia returneaza noua valoare a registrului de control al virgulei
mobile(al coprocesorului matematic 8087).
EXEMPLU: #include
#include
#include
#include
float nr;
main()
{ nr=0.1*0.000000001;
printf("Numarul rezultat este: %.15e \n",nr);
_control87(PC_24,MCW_PC);
printf("Afisat cu precizie de 24 biti este: %.15e \n",nr);
_control87(CW_DEFAULT,0xfffff);
printf("Dupa resetare numarul este: %.15e \n",nr);
sleep(3);
}
Observati ca prin resetarea preciziei de reprezentare,diferenta apare
dupa primele 8 zecimale.
Functia este importanta in cazul calculelor matematice extrem de exacte,
Dostları ilə paylaş: