نه ما متکی به API ویندوز نیستیم، یا به Interrupt خاص یا هر چیز دیگه ای.
هر سیستمی API ها و Interrupt های خاص خودشو داره. ما یه تابع می نویسیم برای سیستم های مختلف که اگه Windows بود از فلان چیز استفاده کنه، اگه Linux بود از یه چیز دیگه... .
یعنی این که نهایتا از چه چیزی استفاده شه به عهده ی کامپایلر هست بر اساس درخواست کاربر.
حتی زبان ++C هم همین کارو می کنه.
یعنی تو یه کد می نویسی و از توابع یکسانی استفاده می کنی، در صورتی که خروجی ها بر اساس کامپایلر ها در محیط های مختلف متفاوت هست.
اگه می خوایم مثل ++C کار کنیم، پس باید یه روشی بذاریم که برنامه نویس اون روال، به کامپایلر بگه اگه برای این سیستم کامپایل می کنی این کد رو بزن، برای اون سیستم اون یکی کد رو بزن... مثل # در ++C که فقط با کامپایلر صحبت می کنه. مثلا فرض کن این طوری:

#if system = DOS
{
...
int 21h
}
elseif system = Windows
{
...
WriteConsole ...
}
else
{
...
}


که این if ها در زمان اجرا، اجرا نمی شن و در زمان Compile پردازششون به عهده ی Pre-Processor هست.