(Asm) Działanie aplikacji w tle redyzentnej

1

Witam. Napisałem swój program rezydentny i działa, ale działa w dziwny, przynajmniej dla mnie sposób... być może wynika to z jakichś luk w wiedzy, jeżeli tak to prosiłbym o informacje gdzie/co źle pojmuję w tym temacie.

A więc... Napisałem obsługę przejęcia przerwania INT 8H (czyli zegara) i to działa jako program rezydentny. Ten program działa tak, że przejmuje przerwanie wypisuje znak dolara i skacze do oryginalnej funkcji przerwania, czyli obsługa przerwania przez program rezydentny wygląda tak:

mov ah, 2
mov dl, '$'
int 21h
	
jmp word far [cs:org_adres]

Gdzie zmienna org_adres, to zmienna 4 bajtowa przechowująca segment i offset oryginalnego wektora przerwania uzyskany za pomocą funkcji 35h (przerwania 21h). Reszta kodu to "instalacja", która wygląda, że została napisana poprawnie.

Napisałem też drugi program, który przejmuje przerwanie (które zostało już przejęte - najpierw uruchamiam instalator tsra a potem ten program. głupie, wiem. ale to dla testu żeby zobaczyć czy działa poprawnie! :) ). Program ten przejmuje przerwanie i wypisuje znak sharpa i przeskakuje dalej, czyli kod wygląda tak:

mov ah, 2
mov dl, '#'
int 21h
	
jmp word far [cs:org_adres]

Program kończy działanie po naciśnieniu klawisza klawiatury. Po uruchomieniu obydwu programów tak jak to zostało przedstawione powyżej uzyskam efekt wypisywania na ekran odpowiednio $# dla każdego przerwania od 8h, czyli wygląda na to, że programy zostały napisane poprawnie (tak?). Natomiast jeżeli instalator tsr'a uruchomię w jeden konsoli, a drugi program w drugiej konsoli to wypisuje mi już tylko płotek #, dlaczego ? Czy konsole / programy uruchamiane w konsolach posiadają jakieś specjalną nie współdzieloną pamięć ?

Proszę o pomoc, bo mam braki w wiedzy :)

0

Pozwolę sobie wtrącić jeszcze jedno pytanie, dlaczego muszę uruchomić wspomniany wyżej program aby zobaczyć efekt działania obsługi przerwania skoro on pewien działać w tle i cały czas to wypisywać ?

0

Programy rezydentne są to twory uruchamiane na bazie trybu rzeczywistego i systemu operacyjnego DOS. W systemie Windows nie ma DOSa ani sam system nie pracyje w trybie rzeczywistym tylko chronionym. W trybie chronionym nie ma możliwości uruchomienia kodu z trybu rzeczywistego.
W windowsie twoje programy (właściwie jest to konsola) są uruchamiane w specjalnym trybie emulacji trybu rzeczywistego i systemu DOS. Coś jak program DOSBox. Jeżeli uruchomisz konsole to system będzie w niej emulował DOSa ale jak ją zamkniesz to system zamknie całą emulację. Tak samo jak uruchomisz dwie różne konsole to będą one dwoma różnymi instancjami emulatora.
Z tego co mi wiadomo to emulowanie DOSa w Windowsie implementowane było tylko do wersji XP. Jak chcesz system pracujący bez emulacji to niestety odpal sobie samego DOSa albo co najwyżej Windows 95.

1

Z tego co mi wiadomo to emulowanie DOSa w Windowsie implementowane było tylko do wersji XP. Jak chcesz system pracujący bez emulacji to niestety odpal sobie samego DOSa albo co najwyżej Windows 95.

W XP nie jest emulowane wszystko, w Viście wydaje mi się że jeszcze emulacja jest tylko jeszcze bardziej okrojona. W Se7en chyba jej w ogóle nie ma. Ale wszędzie działa DosBox który emuluje praktycznie wszystko.

Generalnie to pytanie jest dziwne bo to nie lata 90. Jeżeli możesz to przerzuć się na coś 'troszkę' nowszego. A jeżeli nie to nie sądzę żeby ktoś tutaj jeszcze bawił się w takie czary o których już dawno nikt nie słyszał.

Emulatory są po to żeby zachować zgodność ze starymi aplikacjami, nie po to żeby projektować aplikacje pod stare maszyny/OSy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1