Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C/C++/Pascal] nisko-poziomowym programowanie, 16/32 bitowe

johnyjj2 05 Sie 2009 14:00 1085 3
  • #1 05 Sie 2009 14:00
    johnyjj2
    Poziom 7  

    Witam!

    Próbowałem ostatnio dokonać migracji z Turbo Pascala do Free Pascala i pojawił się problem ze wskaźnikami. Otrzymałem od pewnej osoby taką sugestię:

    Cytat:
    Rzecz wygląda tak, że Turbo Pascal był dla 16-bitowego Dosa, który używał modelu pamięci segmentowanej bez ochrony pamięci (więc program miał dostęp do całej pamięci systemu). Wskaźnik składał się z 16-bitowego segmentu i 16-bitowego offsetu. Większość 32-bitowych x86 OS-ów nie używają segmentów (wyjątkiem jest/był OS/2) i wszystkie mają ochronę pamięci. Używają teraz starych rejestrów jako 16-bitowych selektorów i łączą je z 32-bitowym offsetem. Kombinacja takiego 16-bitowego selektora i 32-bitowego offsetu jest zwana "farpointer". Zwykłe wskaźniki (takie jak ^nazwa_wsk) w 32-bitowych OS-ach składają się tylko z 32-bitowego offsetu (selektor niejawnie mapuje dane i stos [stack]).

    Każdy kod, który próbuje bezpośrednio uzyskać dostęp do pamięci używając adresów segment:offset musi być całkowicie przepisany przy przenoszeniu do trybu 32-bitowego (nie można po prostu rozbić wartości segmentu na rejestr selektora [selector register], spowoduje to błędy). Trzeba zdać sobie sprawę z celu kodu i znaleźć równoważny sposób uzyskania informacji w OS-ie, którego się używa. Tak samo też z przerwaniami [interrupts] - nie można użyć przerwań oprogramowania pod czymkolwiek innym, niż Dos w celu skomunikowania się z BIOS-em lub OS-em. A nawet jeśli się skompiluje z FPC dla Dos/Go32v2, trzeba przepisać większość kodu przerwać z powodu różnic w modelu.

    Problemy te nie są związane z (Free) Pascalem, ale z różnicami pomiędzy 16-bitowym programowaniem dla Dosa i 32-bitowym (te same problemy pojawiłyby się, gdyby program był w C lub C++). Dobrym rozwiązaniem jest przeczytanie tutoriala o nisko-poziomowym programowaniu dla Dosa w celu zaznajomienia się ze sposobem działania 16-bitowych programów Dosowych (model pamięci segmentowanej, przerwania w celu komunikacji z "OS"-em i BIOS-em, nisko-pamięciowym projektem obszaru danych BIOS-a [low memory BIOS data area layout]).


    Rzecz w tym, że nie jestem zbyt dobrze zorientowany w tego rodzaju zagadnieniach. Czy możecie mi polecić jakieś strony internetowe, gdzie w/w zagadnienia są opisane w prosty i w miarę kompletny sposób?

    Pozdrawiam!

  • #3 05 Sie 2009 14:52
    johnyjj2
    Poziom 7  

    Otóż chcę skompilować pod XP program, który został napisany osiemnaście lat temu w Turbo Pascalu. W tym celu chciałem go skompilować pod Free Pascalem. Poprawiłem kilka błędów, spowodowanych różnicami między TP i FPC, aż zatrzymałem się na takich:

    nazwa_pliku.pas(1820,10) Error: Incompatibile types: got "FarPointer" expected "^nazwa_wskaznika"
    nazwa_pliku.pas(1825,10) Error: Incompatibile types: got "FarPointer" expected "^Char"
    nazwa_pliku.pas(1834,7) Error: Incompatibile types: got "FarPointer" expected "^nazwa_wskaznika"

    Pozdrawiam!

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME