[ Texas Instruments @ 04.04.2010. 12:44 ] @
Zna li neko kako su implementirani sami sistemski pozivi, recimo za DOS, za ispis karaktera na ekran? |
[ Texas Instruments @ 04.04.2010. 12:44 ] @
[ 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; Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|