[ Texas Instruments @ 04.04.2010. 12:44 ] @
Zna li neko kako su implementirani sami sistemski pozivi, recimo za DOS, za ispis karaktera na ekran?
[ burex @ 04.04.2010. 13:29 ] @
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
[ Texas Instruments @ 04.04.2010. 14:13 ] @
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"?
[ burex @ 04.04.2010. 16:09 ] @
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

[ Texas Instruments @ 04.04.2010. 16:28 ] @
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.
[ burex @ 04.04.2010. 17:27 ] @
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:
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;