O Watcomu se tehdy rikaly legendy a nebyl spatny, i s vlastnim 32bitovym extenderem. Rekl bych, ze vetsina her v dobach 386 v nem byla psana, ale my ve skole meli TP a potom i ten BC.
djgpp prisel o par let pozdeji, to byla pecka, i kdyz casy prekladu na 486 byly dlouhe - clovek tehdy pochopil, proc se preklada a linkuje oddelene :)
Mírně upřesním, jak je to s tím extenderem.
Firma PharLap dodávala dva extendery. Šestnáctibitový DOS16M, který využívá protected mode i286 a třicetidvoubitový DOS4G, který využívá protected mode i386. Oba se prodávaly zvlášť a stály pěknou raketu.
Součástí instalace Watcomu byla odlehčená verze DOS4GW, která měla, proti DOS4G, nějaká omezení.
Myslím si, že by se hodilo ukázat i 16bitový, nebo alespoň 32bitový výstup GCC. Moje instalace GCC se s volbou -m16 o 16bitový výstup snaží – ale vypadne z ní 32bitový elf plný 66h prefixů. I tak mi to přijde víc relevantní než ukazovat 64bitový kód, obzvlášť používající SIMD instrukce. SIMD instrukce nedávají při porovnávání s 16bitovou x86 smysl.
Tak jsem ten -m16 zkoušel a vygeneruje to 16bitový kód, ale s 32bitovými registry atd. V podstatě tedy jako DOS na 386 nebo 486. Předpokládám, že to používá jádro pro boot v realtime a přechod do chráněného režimu.
Když se to donutí použít 16bitové registry, tak to vypadá takto:
short int add(short int a, short int b) {
return a+b;
}
A optimalizace dopadne:
mov eax, DWORD PTR [esp+8]
add ax, WORD PTR [esp+4]
ret
proč tam dává EAX je ovšem trošku záhadou :-)
Zahadou to nie je, je to priamo v dokumentacii:
The -m16 option is the same as -m32, except for that it outputs the .code16gcc assembly directive at the beginning of the assembly output so that the binary can run in 16-bit mode.
Taktiez vidno, ze stale pouziva 32-bit ABI (premenne na zasobniku su zarovnane na 32-bit).
Skutocny 16-bitovy rezim ale v gcc bol, minimalne Atari ho pouzivalo v prvej polovici 90-tych rokov.
14. 5. 2025, 09:03 editováno autorem komentáře
K Zortechu bych dodal, že původně ho dodávala firma Zortech Inc., pozděj ho nějakou dobu měl Symantec, takže se i změnilo jméno na Symantec C++ a teprve potom byl Digital Mars.
Mám dojem, že k němu existoval i protected mode extender.
Zortechem resp. Symantecem byly builděné např. Norton Tools nebo Partition Magic.
Watcom zase původně byl školní projekt na University of Waterloo. Odtud to jméno, jako 'Waterloo compiler'.
Jeho další zajímavostí je, že měl knihovny a uměl linkovat NLM moduly pro Novell Netware. To drtivá většina ostatních vývojových prostředí neuměla.
A OpenWatcom to umí do dnes.
Z těch méně známých kompilátorů a vývojových prostředí bych ještě připomněl IBM VisualAge for C++ pro OS/2 a Metrowerks CodeWarrior, který je jinak známý spíš v oblasti embedded. Existovala ale i verze pro PC.
Druhý jmenovaný také patřil k nemnoha vývojovým prostředím, podporujícím Novell Netware NLM.
Nespomína si niekto?
Myslím, že v PC World bol v jednom čísle článok o tom, že C vzniklo ako vtip. Dal nám to raz niekto prefotené. Vraj dlho kompiluje a veľa riadkov a tak. Dlhé roky som si myslel, že akí sú ľudia hlúpi, že naleteli a potom som sa dozvedel, že sa jednalo o aprílové číslo a článok bol myslený ako vtip. Naletel som. Rád by som si to prečítal znova. Stalo to za to.
Kolem roku 2000 sem pozil Watcom C/C++ a ASM pro napsani rezidentniho SLIP/ETH 'prehazovace' IP packetu (SlipBridge, pro platebni terminal pouze se seriovym portem), ktery bezel na DOS pokladne a sdilel sitovou kartu s Novel Netware a navic poskytoval i 'API' pro tu pokladnu.
Prave pro tyhle veci se perfektne hodila moznost predavat mezi C a ASM parametry pres 'explicitni' specifikaci registru ....
static
int ARPAskAddr(tIPAddr IPAddr){
#pragma AUX ARPAskAddr parm [ DX CX ];
// callbacks ...
void far *ARPFindSlot(WORD Handle,WORD Len){
#pragma AUX ARPFindSlot parm [ BX ] [ CX ] value [ CX DI ];
// RFC 826 :-)
void ARPProcessSlot(WORD Handle,void far *Slot,WORD Len){
#pragma AUX ARPProcessSlot parm [ BX ] [ DX SI ] [ CX ];