Zna li neko kako su implementirani sami sistemski pozivi, recimo za DOS, za ispis karaktera na ekran?
Implementacija sistemskih poziva
Zaključano
Zakačeno
DOS koristi interrupt 0x21 kao "gateway" za prihvatanje sistemskih poziva, a kada se podesi registar AH da bude 9 i u registar DX se ubaci pokazivač ka početku stringa koji želimo da ispišemo, onda DOS ispisuje željeni string karakter po karakter sve dok ne dođe do znaka $ (znak dolara je terminator stringa, dakle svaki string koji želimo da ispišemo mora da bude u formi 'Zdravo!$'). Ne mogu tačno da tvrdim šta se dešava ispod haube u ovom slučaju, ali pošto DOS uglavnom radi u RealMode-u i ne koristi neke naprednije grafičke režime rada, pretpostavljam da jednostavno DOS usmerava sve ove pozive ka BIOS-ovom interrupt-u 0x10, i to konkretno na ovu funkciju.
Nadam se da sam donekle pomogao :P
Nadam se da sam donekle pomogao :P
Potpis
A man is smart. People are stupid.
Citat:
Ne mogu tačno da tvrdim šta se dešava ispod haube u ovom slučaju
Pa manje više je i meni jasno kako se poziva neki syscall, ali me ovo i dalje kopka i nekako mi je i dalje mistično. :)
Ti proslediš neke vrednosti kroz registre i pozovoeš neki int i šta onda, neki mali ljudi uhvate one znake i ispišu ih na ekran. :)) Šalim se, ali me zanima koje instrukcije idu ispod toga, kako izgleda taj interrupt, najprostije rečeno, kako bismo mi napisali tako nešto "from the scratch"?
Citat:
kako bismo mi napisali tako nešto "from the scratch"?
Pročitaj još jednom:
Citat:
pretpostavljam da jednostavno DOS usmerava sve ove pozive ka BIOS-ovom interrupt-u 0x10, i to konkretno na ovu funkciju.
Dakle, pravac na http://helppc.netcore2k.net/interrupt/int-10-9 i vidi kako treba da radi BIOS int 0x10 poziv, pa lepo ištampaj na ekran šta želiš "from scratch". Ja sam lično koristio TTY mode tj. int10, sa AH=0x0E:
http://helppc.netcore2k.net/interrupt/int-10-e , i to na sledeći način:
Code:
print:
push ax
.prn:
lodsb
or al,al
jz .end
mov ah,0eh
int 10h
jmp .prn
.end:
pop ax
ret
mov si,nekitext
call print
nekitext db 'BLAAAAAA!',13,10,0
print:
push ax
.prn:
lodsb
or al,al
jz .end
mov ah,0eh
int 10h
jmp .prn
.end:
pop ax
ret
mov si,nekitext
call print
nekitext db 'BLAAAAAA!',13,10,0
Potpis
A man is smart. People are stupid.
Nisi me razumeo, ili se ja nisam lepo izrazio šta me konkretno zanima.
Dakle, to što si mi ti naveo kao primer je korišćenje biosovog interrupt-a 10h, ali mene zanima šta se dešava unutar njega, kakve instrukcije koristi? Kada sam to pisao "kako bismo mi to napisali from the scratch", mislio sam na samu implementaciju int 10h.
Dakle, to što si mi ti naveo kao primer je korišćenje biosovog interrupt-a 10h, ali mene zanima šta se dešava unutar njega, kakve instrukcije koristi? Kada sam to pisao "kako bismo mi to napisali from the scratch", mislio sam na samu implementaciju int 10h.
Uopšteno - kada se pozove funkcija za ispis teksta, BIOS piše u određenu oblast memorije (pretežno 0xB8000 na x86 sistemima, ako se dobro sećam) i to u odgovarajućem formatu (8bita za ASCII kod karaktera + 8bita za boje i ostale parametre), a prisutna grafička kartica grabi ono što tamo piše i izbljune sve na ekran po potrebi sa svojim ugrađenim "fontovima". Dakle, ako baš želiš da radiš na najnižem mogućem nivou (a u protected/long mode-u je to imperativ), jednostavno crtkaš ono što ti treba u memorijski bafer na 0xB8000 (pod uslovom da radiš u tekstualnom režimu).
Primer jedan:
Primer jedan:
Code:
char *video = (char *) 0xb8000;
unsigned int i,n,off=0;
off = 80;
for (i=0;i<80;i++)
{
video[n] = ' ';
n++;
video[n] = 0x10;
n++;
}
video[68+off] = 'H';
video[69+off] = 0x10;
video[70+off] = 'e';
video[71+off] = 0x10;
video[72+off] = 'l';
video[73+off] = 0x10;
video[74+off] = 'l';
video[75+off] = 0x10;
video[76+off] = o';
video[77+off] = 0x10;
video[78+off] = '!';
video[79+off] = 0x10;
char *video = (char *) 0xb8000;
unsigned int i,n,off=0;
off = 80;
for (i=0;i<80;i++)
{
video[n] = ' ';
n++;
video[n] = 0x10;
n++;
}
video[68+off] = 'H';
video[69+off] = 0x10;
video[70+off] = 'e';
video[71+off] = 0x10;
video[72+off] = 'l';
video[73+off] = 0x10;
video[74+off] = 'l';
video[75+off] = 0x10;
video[76+off] = o';
video[77+off] = 0x10;
video[78+off] = '!';
video[79+off] = 0x10;
Potpis
A man is smart. People are stupid.