לדלג לתוכן

1.1 - פתיחה - הרצאה

דיסקליימר

בפרק הבא ההרצאות מידי ארוכות, קחו את הזמן- תעכלו את החומר, תקראו על כל מה שנלמד עוד עם הchatgpt ובגוגל- זה בסדר אם כל הרצאה ותרגול יקח לכם הרבה זמן,
לכל הרצאה בפרק יש המון תוכן חדש.

הקדמה

המעבד שלנו היא מכונה משומנת שיודעת לקבל הוראות, בבינארית ולבצע אותן.
בעבר מתכנתים היו ממש כותבים תוכנות בבינארית ישירות בתוך הזכרון (ממש מדליקים ביטים מסוימים בRAM)
להוראות אלו, נקרא בשם יותר מקצועי- "שפת מכונה"

העולם התפתח וקצת השתנה- הוסיפו מגנונים שונים למחשב (ולא הרבה) ופיתחו המון תוכנות מעל המעבדים האלו.

המצאה היסטורית שהגיעה אלינו ב1956 היא המצאת "האחסון"- התקן שמחובר למעבד שמאפשר לשמור כמות מידע רחבה מאוד- יותר מאשר הRAM שאנחנו מכירים, ויודעת לוודא שהמידע נשמר גם לאחר שהמחשב מתכבה.
כך רכיב האחסון מאפשר למתכנתים לכתוב תוכנות ששומרות מידע פרסיסטנטי על הדיסק.

עוד המצאה באותה התקופה הייתה ה"אסמבלר".
האסמבלר היא תוכנה, שאיפשרה לנו לכתוב תוכנות לא בבינארית, אלה בשפת תכנות שנקראת "אסמבלי"- שפה זאת מאפשרת לנו לכתוב הוראות למעבד במילים ולא בבינארית.
האסמבלר היא תוכנה שידעה להמיר את ההוראות שכתבנו במילים, ולהפוך אותם לשפת מכונה (הוראות בבינארית) שמעבד יודע להריץ.

נרוץ קצת קדימה בזמן ל1981, בשנה זו פותחה אחת ממערכות ההפעלה הראשונות והפורצות דרך בהיסטוריה- MS-DOS (microsoft disk operating system),
הMS-DOS היא תוכנה שנכתבה בעיקר למתכנתים, ומטרתה הייתה לאפשר למתכנתים לכתוב תוכנות למעבד שלהם, ולהריץ אותן בפשטות.
מערכת הפעלה היא תוכנה גדולה ובסיסית שרצה על המעבד, מערכת הפעלה יודעת לנהל את המעבד ולתת interface נוח למשתמשים לעבודה עם המחשב.

הMS-DOS היא מערכת הפעלה שהיה לה המון פיצ'רים, איפשרה למשתמשים שלה לשמור מידע ב"קבצים" ו- "תיקיות".
בנוסף בMS-DOS היה "טרמינל" פשוט, שאיתו מתכנתים יכלו לעבוד ולנהל את מערכת ההפעלה שלהם ובין היתר גם את הקבצים.
הMS-DOS היה גם תוכנת אסמבלר, אשר מאפשרת למתכנתים לכתוב קוד אסמבלי, לשמור אותו בדיסק- ולהמיר את האסמבלי לשפת מכונה ולהריץ אותו בתוך מערכת ההפעלה.

דמיינו תוכנה אחת שתוכלו להריץ על המחשב שלכם, שתאפשר לכם גם לכתוב מידע באחסון בצורה פשוטה עם טרמינל, גם לכתוב תוכנות, ולהריץ אותן בתוך הinterface שלה.
כלומר, תוכנה שיודעת ממש להריץ תוכנות אחרות שאתם כותבים בתוכה!

מעבד ה8086

אחת מפריצות הדרך הגדולות בהיסטוריה היא פיתוח מעבד ה8086.
ה8086 הוא מעבד שפותח על ידי חברת אינטל ב1978 ועל בסיסו פותחה הארכטיקטורת מעבדים הפופלרית ביותר בעולם ה-"x86" שעד היום מפותחים המון מעבדים על בסיסה.

בפרק הזה נלמד כיצד לפתח קוד אסמבלי למעבד ב8086 מעל מערכת ההפעלה MS-DOS.
פרק זה יהווה לנו בסיס לפיתוח אסמבלי במעבדים עדכניים יותר, ופיתוח Low level בכלל.

הכנות

תוכלו להרים אימולטור של מעבד 8086 ו-MS-DOS כמערכת הפעלה באמצעות אימולטור "DOSBox"
פתחו את הקישור הבא:
https://www.dosbox.com/download.php?main=1
ולחצו על "Download Now"
יפתח לכם האתר הבא:
צילום מסך: דף ההורדה של DOSBox באתר SourceForge, ההורדה מתחילה אוטומטית
המתינו כמה שניות עד שיורד לכם התוכנה.
צילום מסך: קובץ ההתקנה DOSBox0.74-3-win32-installer.exe בתיקיית ההורדות
הריצו אותה.
אחרי סיום ההתקנה כאשר תחפשו "DOSBox" בחיפוש תראו את התוכנה הזו:
צילום מסך: חיפוש DOSBox 0.74-3 בתפריט ההתחלה של חלונות, מציג את תוכנת DOSBox שהותקנה
תפתח לכם התוכנה:
צילום מסך: חלון DOSBox נפתח עם הודעת הפתיחה Welcome to DOSBox v0.74-3
זה אימולטור של DOSBox!
מערכת ההפעלה MS-Dos הינה מערכת ההפעלה הראשונה של מיקורסופט, ומערכת ההפעלה ווינדוס המודרנית מבוססת עליה- פקודות שלמדתם בקורס "ווינדוס בסיסי" חלקן יהיו רלוונטיות גם עכשיו. הקלידו את הפקודה "dir" כדי לראות את כל הקבצים בתקייה שאתם נמצאים בה.
צילום מסך: פלט הפקודה dir בתוך DOSBox, מציג את קבצי המערכת כמו COMMAND.COM, MOUNT.COM ו-CONFIG.COM
כדי לוודא שהאימולטור רץ עם כמה שיותר משאבים, כתבו את הפקודה cycles=max
צילום מסך: הרצת הפקודה cycles=max בתוך DOSBox כדי למקסם את משאבי האימולטור
עכשיו כדי להתחיל לכתוב קוד אסמבלי, נרצה לכתוב אותו אצלנו במחשב.
נכין תקייה אצלנו במחשב, עם הקוד אסמבלי שאנחנו כותבים (באיזה text editor שנבחר), עם אסמבלר ודיבגר.
לאחר שנסיים להכין את התקייה, נוכל ליצור ליצור קישור בין התקייה אצלנו למחשב לתקייה באימולטור באמצעות הפקודה "mount" (בדומה לmount שלמדנו בקורס לינוקס).

עורך טקסט שאני ממליץ עליו לפיתוח אסמבלי הוא notepad++, אבל מוזמנים להשתמש באיזה עורך טקסט שאתם מעדיפים.
האסמבלר שנשתמש בו הוא TASM (הturbo assembler), הכנתי לכם תקייה מקובצת עם האסמבלר, והדיבגר בקישור "https://amittech.dev/everything.zip"

חלצו את התקייה בכונן C, שלכם בנתיב שתבחרו- אני חילצתי ב C:/everything.
הריצו עכשיו פקודת mount, כדי למפות את התקייה שלכם במחשב לדיסק על האימולטור
צילום מסך: פקודת mount c: c:\everything ב-DOSBox, מציגה אישור שהכונן C מחובר לתיקייה המקומית
עכשיו תוכלו להחליף את הכונן שאתם נמצאים בתוכו כמו בווינדוס, באמצעות הקלדת: c:
צילום מסך: החלפת הכונן הפעיל ל-C ב-DOSBox באמצעות c:
ועכשיו אם נעשה dir נוכל לראות את כל הקבצים שלנו
צילום מסך: פלט dir בכונן C ב-DOSBox, מציג את קבצי TASM, TLINK, TD ו-BASE.ASM
שימו לב שבתקייה שלנו יש קובץ בשם base.asm
הוא מכיל קובץ אסמבלי בסיסי, בשיעור הבא נדבר על הקוד שנמצא בו.
כדי להפוך את הקובץ אסמבלי לקובץ הרצה, כתבו את הפקודה

tasm /zi base.asm

צילום מסך: הרצת tasm /zi BASE.ASM ב-DOSBox, מהדר את הקובץ ללא שגיאות או אזהרות
פקודה זו תיצור לנו קובץ שנקרא "base.obj", הוא בעצם קובץ שמכיל את הקוד מכונה.
כדי שנוכל לגרום למערכת ההפעלה שלנו להריץ את קוד המכונה שיצרנו, אנחנו נצטרך להמיר את הקובץ לפורמט מיוחד שמערכת ההפעלה יודעת להריץ.
בווינדוס ו- DOS, פורמט זה נקרא פורמט "DOS MZ"- כל קובץ הרצה כזה, בדרך כלל נגמר ב.exe
כדי לעשות זאת, כתבו את הפקודה
tlink /v base.obj

צילום מסך: הרצת tlink /v BASE.OBJ ב-DOSBox, יוצר את קובץ ההרצה
ופקודה זו יצרה לנו את base.exe. נוכל להריץ אותו עכשיו אם נקליד את שם התוכנה ועם לחיצה על אנטר.
צילום מסך: הרצת base.exe ב-DOSBox, התוכנית רצה וחוזרת לשורת הפקודה מבלי להדפיס דבר (הקוד ריק)
אומנם הרצת הקובץ לא עשתה כלום, כי הקוד שלנו ריק.

הדיבגר - turbo debugger - TD

חוץ מהאסמבלר והלינקר שמאפשרים לנו לקחת אסמבלי וליצור איתו קובץ הרצה של DOS שאנחנו יכולים להריץ במערכת ההפעלה שלנו, יש לנו עוד תוכנה חזקה מאוד בסל הכלים שעדיין לא השתמשנו בה.
הדיבגר (debugger) שלנו- הturbo debugger, דיבגר זה מאפשר לנו להריץ את התוכנה הוראה אחרי הוראה, ולראות את ההוראות שרצות במעבד- הרגיסטרים, והזכרון משתנה בלייב.
כדי לריץ דיבגר על הexe שלנו הריצו את הפקודה:

td base

צילום מסך: הרצת td base ב-DOSBox, פותחת את הדיבגר Turbo Debugger
תפתח לכם החלון הזה, שבו תוכלו לראות את הדיבגר עם הקוד אסמבלי שלנו.
צילום מסך: חלון Turbo Debugger מציג את קוד האסמבלי base.asm עם DATASEG, CODESEG ופקודות mov ו-int 21h
אם לחצתם על החלון, כנראה העכבר שלכם נתקע בתוכו- לחצו על alt + tab כדי לצאת מהחלון.

לחצו על "view למעלה", ואז בחרו ב"cpu"
צילום מסך: תפריט View בטורבו דיבגר פתוח, עם אפשרות CPU ברשימה
יפתח לכם החלון הבא
צילום מסך: חלון CPU 80486 בדיבגר, מציג את הוראות שפת המכונה, הרגיסטרים מימין, וה-data segment למטה
עכשיו תוכלו לגרור את החלון לאן שתרצו עם העכבר ולהגדיל אותו:
צילום מסך: חלון ה-CPU בדיבגר מוגדל, ax עדיין 0000 לפני הרצת ההוראה הראשונה
בחלון זה ניתן לראות את מצב המעבד.
ניתן לראות מימין את כל הרגיסטרים, מלמטה את הdata segment (סגמנט המשתנים)
ובאמצע את הקוד שרץ כרגע.
כאשר מצד ימין ניתן לראות את האסמבלי ומצד שמאל ממש את השפת מכונה (ממש ההוראות בהקס).
בדיבגר נוכל להריץ הוראה הוראה את כל ההוראות, כאשר מקש ה "F8" על המקלדת שלנו, יאמר למעבד לרוץ עוד הוראה.
צילום מסך: לאחר לחיצה על F8, החץ זז להוראה הבאה ורגיסטר ax השתנה ל-087A
לאחר לחיצה על F8 ניתן לראות שהחץ שליד ההוראה זז למטה פעם אחת, כלומר ביצע את ההוראה הקודמת.
בנוסף שימו לב שההוראה הקודמת הייתה הוראת mov שמשנה את רגיסטר ax.
ובאמת ניתן לראות שרגיסטר ax השתנה לערך 87A בהקסה, ניתן לראות זאת מימין למסך.

צילום מסך: המשך הרצת ההוראות בדיבגר, רגיסטר ds מתעדכן ל-087A
צילום מסך: המשך הרצה, רגיסטר ax מתעדכן ל-4C00 לפני קריאת int 21h
צילום מסך: לאחר הרצת int 21h, חלון קופץ עם ההודעה Terminated, exit code 0
לאחר שסיים לרוץ הקוד, אנחנו נראה כי אנחנו מקבלים הודעת "Terminated- exit code 0".
הexit code מעיד על כך שהתוכנה סיימה לרוץ בהצלחה, לחצו על ok.