пʼятницю, 27 травня 2011 р.

Приклади використання асемблера разом з OpenWatcom

Що таке Open Watcom

Open Watcom -- "Open source" версія славного компілятора Watcom. В 90-х йому фактично не було рівний, особливо під платформи DOS та Windows. Багато програм, зокрема канонічних ігор тих (і всіх взагалі) часів, таких як Doom, Hexen, Descent чи Duke Nukem 3D компілювалися саме ним, а заставка DOS/4GW пам'ятна багатьом дотепер. Історія його розпочалася в 80-х роках минулого століття на ниві FORTRAN, компілятор C вийшов у 1984. При тому, ходять чутки що історія цього сімейства компіляторів розпочалася ще в 1965, хоча яка саме природа приємственності між розробками 60-х та 80-х, мені невідомо. В кінці минулого тисячоліття компанія-розробник, SyBase, прийшла до висновку що ринок компіляторів під DOS фактично вимирає, а тягатися з Microsoft під Windows нереально. Тому на початку 2000-х, в кілька етапів, код компілятора було відкрито. (Лише той, що належав SyBase, тому Windows SDK, MFC, тести компілятора, підтримка QNX і т.д. не були відкриті.) Тепер він підтримується та розробляється спів-товариством добровільних розробників. 

Що я про нього думаю
Про сучасний стан фахово говорити мені складно, тому далі виключно моє IMHO. 
Оптимізатор коду С, най-най в 90х, зараз помітно поступається сучасним компіляторам. Підтримка C++ доволі слабенька, хоча певна тенденція прямувати до повної підтримки стандарту C++98 є. Перші версії OpenWatcom використовували STLport, однак потім від неї відмовилися на користь власної Open Watcom STL (OWSTL). Вона все ще неповна і працювати з нею людині, яка звикла до повноцінної (не обов'язково най-най-сучаснішої з найідеальнішою відповідністю стандарту) важко, пробував. Щоправда, спроби використати STLport все ще мають шанс на успіх. З іншого боку, багато важливих платформ, які підтримує OpenWatcom -- 16-бітні, і навряд чи є реальний шанс подружити з ними STLport. Тому потреба у власній реалізації STL велика. (Буду вдячний за вказівку на більш точну інформацію про розвиток STL для OpenWatcom, бажано з посиланнями, тому що не маю впевненості чи я не перебрехав усе).

Ходять крім того по Інтернету чутки що розробники не особливо чуйні, навіть якщо приходити до них із своїми "патчами". Особливо бояться чіпати кодогенератор. Наскільки вони обґрунтовані не знаю.

Вище говориться про недоліки. Але, при тому, це один з найкращих доступних інструментів для розробки під 16-бітні операційні системи, зокрема 16-бітного коду (djgpp, порт мого улюбленого gcc під DOS генерує 32-бітний код та покладається на сервіс DPMI, якщо немає системного -- власний CWSDPMI). При цьому OpenWatcom -- не тільки компілятор/лінкер/асемблер/дизасемблер, що і так було б немало, але й IDE, засоби збірки програм, зневадження, та інші інструменти. 

Взагалі, в ролі host-платформи він може використовувати (тобто -- працює на):  DOS, OS/2, Linux, Windows 16/32-бітний (на 64-бітному він працюватиме як 32-бітна аплікація), RDOS; target-платформи (для яких може генерувати код): всі перераховані + Nowell NetWare (інформація взята з інсталятора OW-1.9). Мови програмування -- FORTRAN, C/C++.

Використання асемблера разом з OpenWatcom

В уроках захищеного режиму Open Watcom використовується якраз завдяки тому, що підтримує генерацю 16-бітного коду. Главу про його взаємодію із зовнішніми функціями, зокрема написаними на асемблері, я вирішив винести в окремий пост. Інформація, подана тут/там -- лише ввідна. (Вона далеко не вичерпна - компілятор має надзвичайно розвинуті засоби для такої взаємодії. І це абсолютно природно, враховуючи зоопарк угод про виклики в тих OS, які він підтримує.)

Ці засоби менш гнучкі  та більш прямолінійні ніж аналогічні в gcc, але зате простіші у вивченні та використанні. (Ех, треба буде колись і про Inline Assembler в gcc написати...)