מדובר במערכות embedded ולרוב עם דרישות real-time ממש לא פשוטות.
מה גם שהמערכות שהם רצים על הם הרבה פעמים מחשבים מאוד מוגבלים,
לכשכותבים bios, לא רק שצריך לכתוב אסמבלי, וצריך לעשות הרבה
במספר פקודות קטן(גם מהירות וגם אין מקום לשמור הרבה מידע)
אלא שכותבים אסמבלי ללא פסיקות, כותבים הכל ממש מאפס.יש המון מערכות embedded מסוגים שונים, ואפשר למעשה לכתוב
את התוכנה שהם מריצים בכל שפה, או בכמה שפות, אבל שפות נפוצות
יהיו אסמבלי,C ובאופן מפתיעה מעט עדה.
הרבה פעמים המערכות עליהם רצים התוכנות מאוד מוגבלות, אין mmu
לפעמים בכלל אין מערכת מרובת תהליכים או מערכת הפעלה בכלל.
זה מכריח אותך להכנס לדברים בסיסיים למדיי.
יש מכונות כמו routers שלרוב יש עליהם איזו מיני מערכת הפעלה
מאוד מוגבלת, ועליה מריצים כל מיני דברים.
אין איזו שיטה קסומה להכין firmware, לכל מכשיר יש דרישות
יחודיות ויש לתוכנה דרכים שונות להתממשק עם דברים אחרים.
הרבה פעמים האסמבלי של המכונה הוא יחודי, אבל בימינו אנשים
נוטים להעדיף COTS ולהשתמש באיזה שהוא אסמבלי מוכר.
הBIOS של המחשב מכיל קוד מכונה נקי של המחשב עליו הוא מורכב,
זה צריך להגדיר הרבה מאוד פסיקות וכל מיני שירותים בסיסיים
של התממשקות עם החומרה. והוא בסופו של דבר צריך לעשות את ה
bootstrapping ולהעלות את מערכת ההפעלה. למעשה הוא טוען
את הMBR לכתובת מסוימת בזכרון(כתובת קבועה) וקופץ לשם לתת
לקוד בMBR להתחיל לרוץ.
הMBR מכיל מעבר לקוד,כל מיני טבלאות מעניינות,אבל ההתחלה ממש
של הMBR היא לרוב פשוט פקודת jmp לקטע שמכיל הקוד ממש.
DRYICE