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.