Borland C++ 3.1 - implicitne volane funkce

Sepsal: Zdenek SAWA

Prekladac Borland C++ 3.1 generuje implicitne do vysleneho kodu volani funkci pro provedeni nekterych operaci. Tyto implicitne volane funkce jsou soucasti standarnich knihoven a jsou pripojeny az v okamziku linkovani. Pokud se tady k programu neprilinkuji standardni knihovny, muze linker zahlasit chybu, prestoze v programu nebyla explicitne pouzita zadna knihovni funkce.

Jedna se o nasledujici skupiny funkci (u dulezitych skupin je uveden seznam zdrojovych textu knihoven Borland C++ 3.1, kde je mozno ziskat blizsi informace o jednotlivych funkcich):

Skupiny funkci:

  • nasobeni, deleni a modulo s long - H_LDIV.ASM, N_LXMUL.ASM, F_LXMUL.ASM
  • shifty s long - H_LLSH.ASM, H_LRSH.ASM, H_LURSH.ASM
  • aritmetika s far a huge pointry - H_PADD.ASM, H_PSBP.ASM, H_PADA.ASM, H_PINA.ASM, H_PSBH.ASM, N_PCMP.ASM, F_PCMP.ASM
  • kopirovani struct na zasobnik a na jiny struct - H_SPUSH.ASM, N_SCOPY.ASM, F_SCOPY.ASM
  • C++ new a delete - vsechny mozne varianty
  • C++ kopirovani objektu
  • chybove hlaseni pri stack overflow (pokud je to v Options zapnuto) - STACK.ASM, STKLEN.C
  • konverze float na long - FTOL.ASM
  • emulace koprocesoru (zavisi na Options)
  • Funkce dulezite pro TUOX

    Vzhledem k tomu, ze pro programy pro TUOX bude pouzito C nikoli C++, ze nebudou pouzity floatove typy a ze maximalni delka segmentu bude omezena na 64kB, takze se budou pouzivat pouze near pointry a mikoli far nebo huge, je pro TUOX podstatna pouze mala cast z vyse uvedenych fukci.

    Tyto jsou dale uvedeny podrobneji:

    Soubor H_LDIV.ASM:

    Funkce LDIV@, N_LDIV@, F_LDIV@:
    deleni - znamenkove, argumenty: dve long hodnoty na zasobniku, vystup: DX:AX = arg1 / arg2
    Funkce LUDIV@, N_LUDIV@, F_LUDIV@:
    deleni - bezznamenkove, argumenty: dve long hodnoty na zasobniku, vystup: DX:AX = arg1 / arg2
    Funkce LMOD@, N_LMOD@, F_LMOD@:
    modulo - znamenkove, argumenty: dve long hodnoty na zasobniku, vystup: DX:AX = arg1 % arg2
    Funkce LUMOD@, N_LUMOD@, F_LUMOD@:
    modulo - bezznamenkove, argumenty: dve long hodnoty na zasobniku, vystup: DX:AX = arg1 % arg2

    Soubory N_LXMUL.ASM, F_LXMUL:

    Funkce LXMUL@, N_LXMUL@, F_LXMUL@:
    Nasobeni dvou long hodnot, agumenty: DX:AX, CX:BX, vystup: DX:AX = DX:AX * CX:BX

    Soubor H_LLSH.ASM:

    Funkce LXLSH@, N_LXLSH@, F_LXLSH@:
    long shift left, argumenty: DX:AX - long hodnota, CL - o kolik posunout

    Soubor H_LRSH.ASM:

    Funkce LXRSH@, N_LXRSH@, F_LXRSH@:
    long shift right - znamenkove, argumenty: DX:AX - long hodnota, CL - o kolik posunout

    Soubor H_LURSH.ASM:

    Funkce LXURSH@, N_LXURSH@, F_LXURSH@:
    long shift right - bezznamenkove, argumenty: DX:AX - long hodnota, CL - o kolik posunout

    Soubor H_SPUSH.ASM:

    Funkce SPUSH@, N_SPUSH@, F_SPUSH@:
    ulozeni struct na zasobnik, argumenty: DX:AX - far pointer na struct, CX - velikost v bytech

    Soubory N_SCOPY.ASM, F_SCOPY:

    Funkce SCOPY@, N_SCOPY@, F_SCOPY@:
    kopirovani struct na jiny struct, argumenty: dva far pointery na struc na zasobniku, prvni - source, druhy - dest

    Soubor STACK.ASM:

    Funkce OVERFLOW@, N_OVERFLOW@, F_OVERFLOW@:
    pokud se testuje preteceni zasobniku a dojde k nemu je volana tato funkce


    Pozn.: Pro TUOX jsou dulezite funkce zacinajici N_... - near varianty funkci.

    Startup

    K programu byva vzdy prilinkovan startup kod oznacovany C0#.OBJ - kde # je prvni pismeno ze zvoleneho modelu, napr. C0S.OBJ pro small model. Tento kod je volan jako uplne prvni po spusteni DOSovskeho programu. Provadi nasledujici cinnosti:
  • zjisteni verze DOSu, ulozeni adresy PSP, zjisteni nejvyssiho dosazitelneho bloku pameti, zjisteni adresy environmentu
  • presmerovani interruptu 0, 4, 5 a 6 a ulozeni puvodnich adres
  • zjisteni poctu a celkove delky envinronment promennych
  • nastaveni pameti pro zasobnik a jeho inicializace
  • nastaveni pameti pro heap a jeho inicializace
  • vynulovani neinicializovanych dat
  • nastaveni dostatecneho mista pro handly souboru
  • ulozeni casu spusteni programu
  • inicializace I/O
  • priprava paramentru pro main
  • v C++ volani konstruktoru globalnich objektu
  • volani funkci definovanych pomoci #pragma startup
  • volani funkce main
  • volani funkce exit
  • C0#.OBJ tedy predpoklada existenci funkci main a exit. Pokud je pouzit exit ze standardnich knihoven, vola v C0#.OBJ funkce __cleanup, __checknull a __terminate.
    Pokud je nastaveno testovani stack overflow, predpoklada se v C0#.OBJ existence promenne ___brklvl - urcuje hranici zasobniku.