3.8 - סקופ - תרגול
תרגול חלק א' - משתנים ו-Scope¶
-
כתבו פונקציה בשם
void test()שבתוכה מוגדר משתנה מקומיint x = 10, והדפיסו אותו עםprintf. נסו לגשת אליו מ-main()וראו שהקומפיילר מתלונן. -
הגדירו משתנה גלובלי
int counter = 0;ובנו שתי פונקציות: -
void inc()שמעלה אתcounter -
void show()שמדפיסה אתcounter
קראו להן מתוךmain()מספר פעמים ובדקו אם הערך נשמר. -
בתוך פונקציה, כתבו
static int counter = 0;ואז כל פעם שהפונקציה נקראת - הגדילו אתcounterוהדפיסו אותו. הריצו את הפונקציה שלוש פעמים מתוךmain()וראו שהערך נשמר. -
הגדירו משתנה גלובלי עם
static, ואז נסו להצהיר עליו בקובץ.cאחר עםextern. נסו לקמפל - תראו שהוא לא נגיש. שנו ל-int x = 5;(בלי static) וראו שהבעיה נפתרת. -
צרו שני קבצים:
-
a.c: מגדירint value = 123; b.c: מכילextern int value;ומדפיס אותו בפונקציהprint()- קמפלו והפעילו את הפונקציה מתוך
main().
תרגול חלק ב' - Inline Assembly¶
- כתבו תוכנית פשוטה ב-C שבה אתם מגדירים משתנה
int result = 0;, ואז בעזרתasmבצעו: - טעינה של
eaxב-5 - טעינה של
ebxב-7 - חיבור בין
eaxו-ebx - שמירת התוצאה בתוך
result - הדפיסו את
result - נסו להחליף את התחביר של האסמבלי ל-Intel syntax ע"י הוספת
asm(".intel_syntax noprefix\n ...") - חפשו בגוגל על תחבירים שונים והסבירו את ההבדלים בניהם
תרגול חלק ג' - קימפול פרויקט עם C ואסמבלי¶
- כתבו קובץ אסמבלי פשוט
tools.asmעם פונקציהprint_hello:שכוללת רקret(כרגע בלי תוכן). -
כתבו קובץ
main.cשמכריז עלextern void print_hello();וקורא לה ב-main(). -
קמפלו את הקבצים:
-
אסמבלי:
-
C:
-
לינקינג:
-
ודאו שהתוכנית מקמפלת. בשלב הבא - הוסיפו קוד אסמבלי אמיתי להדפסת "Hello" בעזרת
int 0x80או פשוט עדכון משתנה ש-main יכול להדפיס. -
נסו לחלק את ההצהרה על הפונקציה האסמבלרית לקובץ
.h, כלול אותו ב-main.c, ולהשתמש ב-staticכדי להסתיר פונקציות/משתנים מקבצים אחרים.
שאלות חזרה:¶
- מה ההבדל בין משתנה מקומי, גלובלי, ו-static מקומי?
- מתי נשתמש ב-
extern? - מה ההשפעה של
staticעל משתנה גלובלי? - מה היתרונות והחסרונות של Inline Assembly?
- מה זה לינקינג ואיך הלינקר יודע לחבר בין קובץ C לקובץ ASM?