שפת אסמבלי מוסברת בפשטות - השפה שכל תוכנה מסתירה מתחת למכסה המנוע¶
אם שמעתם על שפת אסמבלי, כנראה שהתמונה שקפצה לכם לראש היא של האקר גאון יושב מול מסך שחור מלא במספרים ואותיות שאף אחד נורמלי לא מבין. זו התדמית, והיא פשוט לא נכונה. אסמבלי היא לא שפה לגאונים, היא שפה מאוד מסודרת ומאוד הגיונית, פשוט הרבה יותר מפורשת מכל שפה אחרת שכתבתם עד היום.
בואו נפרק את זה בלי מסתורין.
מה זה בעצם אסמבלי¶
בסופו של דבר, מעבד לא מבין פייתון, לא מבין ג'אווה סקריפט, ולא באמת מבין אפילו C. מעבד מבין רק סדרה ארוכה של מספרים בינאריים שנקראת קוד מכונה. כל מספר כזה הוא הוראה - "העתק את הערך הזה", "חבר שני מספרים", "קפוץ לכתובת הזאת אם התנאי מתקיים".
הבעיה היא שקוד מכונה גולמי הוא בלתי אפשרי לקריאה אנושית. אז המצאנו שכבה דקה מעליו שנקראת אסמבלי - במקום שהמעבד יקבל את המספר 137, אתם כותבים משהו כמו mov, ובמקום מספר אחר אתם כותבים add. זו בעצם תרגום ישיר, כמעט אחד לאחד, בין קוד המכונה לבין משהו שבן אדם יכול לקרוא. שורת אסמבלי אחת שווה בדרך כלל להוראת מעבד אחת בדיוק.
זה ההבדל המהותי בין אסמבלי לבין שפות כמו פייתון או C. בשפות גבוהות יש לכם משתנים, פונקציות, טיפוסים, ולולאות מוכנות מראש - כל אלה אבסטרקציות נוחות שמישהו בנה בשבילכם. באסמבלי אין שום דבר מהזה. יש רק רגיסטרים, שהם תאי זיכרון קטנטנים בתוך המעבד עצמו, וכתובות זיכרון. אתם עובדים ישירות עם החומרה, בלי רשת ביטחון.
למה אין רק אסמבלי אחת¶
הנה משהו שמפתיע הרבה מתחילים - אסמבלי היא לא שפה אחת אוניברסלית. כל ארכיטקטורת מעבד מגדירה לעצמה סט הוראות משלה, ואיתו שפת אסמבלי משלה. אסמבלי של מעבדי x86, אלה שנמצאים ברוב המחשבים הניידים והנייחים, שונה לגמרי מאסמבלי של ARM, שנמצאים ברוב הטלפונים הניידים. קוד אסמבלי שכתבתם בשביל אחד פשוט לא ירוץ על השני. זה בניגוד מוחלט לפייתון, שרץ בערך אותו דבר בין אם אתם על מק, על לינוקס או על ווינדוס.
אז למה בכלל ללמוד את זה היום¶
בואו נהיה כנים - כמעט אף אחד לא כותב תוכנה שלמה באסמבלי היום. זה עבודה איטית, מייגעת, וקל לטעות בה. יש לזה סיבה טובה - שפות גבוהות קיימות בדיוק כדי לחסוך לכם את הכאב הזה.
אבל יש שדות שלמים שבהם אסמבלי היא לא אופציה, היא הכרח. הנדסה לאחור, כלומר לקחת תוכנה מוכנה ולהבין מה היא עושה בלי קוד המקור שלה, קורית ברמת האסמבלי כי זה כל מה שיש לכם. פיתוח נצילים לחולשות אבטחה דורש הבנה מדויקת של מה קורה בזיכרון וברגיסטרים בכל רגע נתון. תכנות מערכות משובצות עם משאבים מוגבלים לפעמים דורש שליטה כזאת שרק אסמבלי נותנת. וגם אם אתם לא מתכננים לגעת באסמבלי בעצמכם, הבנה בסיסית שלה משנה איך אתם רואים כל שפה אחרת - כי פתאום אתם מבינים מה הקומפיילר שלכם באמת מייצר מאחורי הקלעים.
מי באמת צריך את זה, ולמי לא¶
אם אתם בונים אתרים או אפליקציות רגילות, סביר שלעולם לא תצטרכו לכתוב שורת אסמבלי בעצמכם, וזה בסדר גמור. אבל אם אתם נמשכים לחוקרי אבטחה, למי שכותב מערכות הפעלה, למי שעובד על דרייברים או על תוכנה למעבדים משובצים, או סתם סקרנים לגבי מה קורה מתחת לכל השכבות - אסמבלי היא נקודת המפתח. היא לא קשה יותר משפות אחרות, היא פשוט דורשת סבלנות, כי אין שום דבר שקורה "מאחורי הקלעים". הכל גלוי, וזה בדיוק מה שהופך אותה לכלי הכי טוב להבין איך מחשב עובד באמת.
בדיוק ככה אנחנו בונים את זה בקורס ליבת המחשב - מתחילים מהיסודות של אסמבלי 16 סיביות, ממשיכים ל-32 סיביות עם ניהול זיכרון אמיתי, ובונים משם הבנה מלאה של איך מחשב פועל מהחומרה ועד למערכת ההפעלה.
ואם באמצע הדרך תיתקעו על הוראה מוזרה או תרגיל שלא מסתדר, אל תתמודדו עם זה לבד.
לסיכום¶
אסמבלי היא לא שפה מיסטית שרק גאונים מבינים, היא פשוט השפה הכי כנה שיש. אין בה קסמים, אין בה דברים שקורים מעצמם - יש רק רגיסטרים, זיכרון, והוראות שהמעבד מבצע אחת אחרי השנייה. ברגע שתבינו את זה, אתם לא רק לומדים שפה נוספת, אתם מבינים מחדש כל שפה אחרת שכתבתם עד היום.