לדלג לתוכן

3.8 סקופ תרגול

תרגול חלק א' – משתנים ו-Scope

  1. כתבו פונקציה בשם void test() שבתוכה מוגדר משתנה מקומי int x = 10, והדפיסו אותו עם printf. נסו לגשת אליו מ־main() וראו שהקומפיילר מתלונן.

  2. הגדירו משתנה גלובלי int counter = 0; ובנו שתי פונקציות:

  3. void inc() שמעלה את counter

  4. void show() שמדפיסה את counter
    קראו להן מתוך main() מספר פעמים ובדקו אם הערך נשמר.

  5. בתוך פונקציה, כתבו static int counter = 0; ואז כל פעם שהפונקציה נקראת – הגדילו את counter והדפיסו אותו. הריצו את הפונקציה שלוש פעמים מתוך main() וראו שהערך נשמר.

  6. הגדירו משתנה גלובלי עם static, ואז נסו להצהיר עליו בקובץ .c אחר עם extern. נסו לקמפל – תראו שהוא לא נגיש. שנו ל־int x = 5; (בלי static) וראו שהבעיה נפתרת.

  7. צרו שני קבצים:

  8. a.c: מגדיר int value = 123;

  9. b.c: מכיל extern int value; ומדפיס אותו בפונקציה print()
  10. קמפלו והפעילו את הפונקציה מתוך main().

תרגול חלק ב' – Inline Assembly

  1. כתבו תוכנית פשוטה ב־C שבה אתם מגדירים משתנה int result = 0;, ואז בעזרת asm בצעו:
  2. טעינה של eax ב־5
  3. טעינה של ebx ב־7
  4. חיבור בין eax ו־ebx
  5. שמירת התוצאה בתוך result
  6. הדפיסו את result
  7. נסו להחליף את התחביר של האסמבלי ל־Intel syntax ע"י הוספת asm(".intel_syntax noprefix\n ...")
  8. חפשו בגוגל על תחבירים שונים והסבירו את ההבדלים בניהם

תרגול חלק ג' – קימפול פרויקט עם C ואסמבלי

  1. כתבו קובץ אסמבלי פשוט tools.asm עם פונקציה print_hello: שכוללת רק ret (כרגע בלי תוכן).
  2. כתבו קובץ main.c שמכריז על extern void print_hello(); וקורא לה ב־main().

  3. קמפלו את הקבצים:

  4. אסמבלי:

    nasm -f elf32 tools.asm -o tools.o
    

  5. C:

    gcc -m32 -c main.c -o main.o
    

  6. לינקינג:

    gcc -m32 tools.o main.o -o hello_program
    

  7. ודאו שהתוכנית מקמפלת. בשלב הבא – הוסיפו קוד אסמבלי אמיתי להדפסת "Hello" בעזרת int 0x80 או פשוט עדכון משתנה ש־main יכול להדפיס.

  8. נסו לחלק את ההצהרה על הפונקציה האסמבלרית לקובץ .h, כלול אותו ב־main.c, ולהשתמש ב־static כדי להסתיר פונקציות/משתנים מקבצים אחרים.

שאלות חזרה:

  1. מה ההבדל בין משתנה מקומי, גלובלי, ו־static מקומי?
  2. מתי נשתמש ב־extern?
  3. מה ההשפעה של static על משתנה גלובלי?
  4. מה היתרונות והחסרונות של Inline Assembly?
  5. מה זה לינקינג ואיך הלינקר יודע לחבר בין קובץ C לקובץ ASM?