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?