[ Shadowed @ 18.10.2003. 23:46 ] @
Ne znam bas dobro asm ali koliko mi je poznato pri pozivanju DOS interrupt-a zapravo se poziva neki program (nesto kao funkcija) koja se nalazi "negde" (u BIOS-u?). Ako je ovo tacno moze li se nekako izvuci kod tih funkcija?
[ tOwk @ 19.10.2003. 00:38 ] @
U zavisnosti od toga šta ti treba, najverovatnije može.

Ukratko, pogledaj gde se nalazi IVT (Interrupt Vector Table) u „realnom režimu“ Intel procesora (na utvrđenom mestu, negde na početku adresnog prostora, da li beše adresa 0, ili možda još koji segment iznad, ne sećam se).

Tu ćeš naći gde se skakuće pri pozivu određenog prekida. Naravno, ne može se lako odrediti gde je „kraj“ funkcije, ali ako hoćeš da čitaš kôd, možda nešto i sam provališ.

Ako ne znaš kako da nađeš nešto od ovoga, ključne reči su: Ralf Brown Interrupt List.
[ Shadowed @ 20.10.2003. 00:20 ] @
Ovo prvo sto si rekao razumem sta znaci ali nemam blage veze kako da dodjem do toga.
Ralf Brown Interrupt List je odlicna stvar i veoma mi znaci sto sam dosao do toga (komplikovaniji nacin da kazem hvala :)) ali to je koliko sam uspo da shvatim samo spisak prekida ali ne i kod koji se izvrsava kad se neki od njih pozove.
Ovo mi treba jer zelim da vidim kako to radi. Na primer sta se sve desava da bi se prikazao karakter na ekranu. Ovako ja samo pozovem prekid ali ne znam sta se tu desava (a to je ono sto me interesuje).

Takodje (da ne pokrecem sad novu temu) me interesuje gde bi mogao da nadjem "tabelu ekvivalenata" asm instrukcija i masinskog koda. Probao bih sa Google-om ali ne znam ni koje kljucne reci koritio (ne znam bas terminologiju).
[ tOwk @ 20.10.2003. 00:38 ] @
Koliko se sećam, RBIL (skraćeno :-) sadrži i dosta „sporednih“ podataka, kao što su podaci o IVT-u, i ostalim stvarima.

Mislim da ti takođe može pomoći i staro izdanje „The Art Of Assembly Language Programming“ (ono koje ne koristi HLA, već stari dobri asembler za 16-bitne Intelove procesore :-), koje možeš naći na istom mestu gde i novo (gugl :-).

Što se tiče samog koda, stvar je ovakva.

Taj kod se nalazi u BIOS-u koji je smešten negde na adresi od 0xff0000 (bar mi se čini, pošto valjda ceo BIOS zauzima 64kb), ili u segmentnom zapisu ff00:0000. E sad, u IVT koji se isto nalazi na nekoj fiksiranoj poziciji se nalazi običan niz pokazivača na tu memoriju.

Praktično, kada ti uradiš INT 21H, procesor radi sledeće:
— Pročitaj pokazivač sa <IVT-base>+0x21
— Još neka administracija oko svega toga
— CALL <pročitana-vrednost>

E sad, ti treba da pronađeš koja je to osnovna adresa IVT-a, i da isto tako pročitaš podatke odatle. Tako dobijaš pokazivač na početak funkcije u BIOS-u (mada, funkcije 0x21 su DOS-ove funkcije, te nisu u BIOS-u, već u prvih 1MB memorije, gde ih već DOS rasporedi), tj. memoriji.

Dalje, ne može se automatski proceniti gde je sav kod koji tebi treba (pošto su mogući JMP-ovi na sve strane, i nema razloga da kôd bude linearan, čak i sumnjam da jeste). Ukratko, ovo je vrlo težak put da saznaš nešto tako jednostavno kao što je „kako se ispisuje znak na ekran“.

Što se tiče liste mašinskih kodova i odgovarajućih instrukcija, potraži na Intelovom sajtu (developer.intel.com) „Pentium Instruction Set Reference“ — to je jedna od knjiga koju je Intel i besplatno isporučivao, te možda možeš da pokušaš i tako da je nabaviš (ima tema o tome, i tu si upravo odgovorio koliko vidim, i nisi baš imao sreće :-). Takođe, u nekom od tih uputstava možeš pronaći i adresu za IVT u realnom režimu.

Što se tiče konkretnog primera (ispis znaka na ekran), najbolje ti je da pronađeš neki VGA hardverski priručnik, ili već da pogledaš izvorni kôd nekog od gomile dostupnih VGA drajvera u slobodnim jezgrima (KFreeBSD, Linux, ...).
[ Shadowed @ 20.10.2003. 00:50 ] @
E sad bolje kapiram.
Te Intelove knjige () upravo skidam sa neta u pdf-u pa cu pogledati.

BTW, moram reci da ti je onaj maturski mnogo dobar. I kod mi je bio sasvim razumljiv iako nisam radio sa C-om 2-3godine. Tad kad sam ga citao sam prilicno stvari naucio iz njega.
[ stsung @ 23.10.2003. 02:09 ] @
Citat:
Shadowed:
Ako je ovo tacno moze li se nekako izvuci kod tih funkcija?


Pozd.
Kod se mozhe izvuci, ali ce biti blaga komplikacija kod razdvajanja koda i neizvrshivih delova (npr. stringova za ispis i slichno). Ako te zanima neshto konkretno (neki dos alat ili shta god), imam source DOS-a 6.22 pa ti mogu poslati delove (preveliko je da se shalje celo).

Svako dobro.
[ Shadowed @ 23.10.2003. 22:56 ] @
Nista konkretno za sad. Samo istrazujem i ne pravim nista konkretno.
[ Pera_Anarhista @ 07.11.2003. 16:14 ] @
hm, nisam se pre bavio time nesto puno, ali koliko se secam, karaktere mozes direktno da upisujes u graficku karticu, pa valjda ona sama odradi posao, treba samo ubaciti pravi mod.
[ tOwk @ 07.11.2003. 17:25 ] @
Dobro se sećaš. To važi za sve „osnovne“ grafičke režime VGA kartica, kada je potrebno samo upisivati u memoriju na adresi 0xa000:00 (čini mi se, i moje sećanje slabi :-), a na raspolaganju je jedan segment od 64kb. Takođe, postoji i varijanta sa upotrebom 0xb000.

Istovremeno, čak i neki napredniji režimi koji zahtevaju više od 64kb video memorije (640x480 u 16 boja zauzima 150kb) koriste takav način pristupa, a pre svih je tu VESA Bios Extensions, koji koristi mogućnosti izmene „prozora“ u video memoriju, pa je npr. u jednom trenutku ovih 64kb mapirano na drugih 64kb u video memoriji, itd.
[ -zombie- @ 07.11.2003. 17:42 ] @
Citat:
tOwk:
Takođe, postoji i varijanta sa upotrebom 0xb000.


koliko se ja sećam, od adresa na 0xb000 pa na dalje, jedino se prostor od 0xb800 pa sledeći valjda 2k bajtova koristilo za TEXT mod.

ne znam upotrebu tog dela memorije za grafiku...
[ hype @ 07.11.2003. 23:49 ] @
t0wk dobro zbori. Secam se kao da je bilo juce, a ne pre 10 god ;)
0xb800 je vga video memorije u text rezimu (bajt atribut, bajt char), 0xb000 je isto to, ali na mda/hercules karticama.
0xa000 je vga video memorija u grafickom rezimu, i jeste koristio se bank-switching da se probije 64k.... zaboravih kako :)
Uff, izgleda da mi secanje i nije toliko frisko :)