האסמבלי שעליו נכתב הסיכום הוא x86 עם סינתקס של at&t
א) אין משתנים באסמבלי
1) כל המידע נשמר תחת אותם הregisters
2) צריך להבין מאוד טוב conventions כדי לא לטעות בניהול המידע.
3) הזכרון הוא פשוט מערך של בייטים.
ב) ישנו מספר מוגבל של registers שאפשר להשתמש בהם כדי לאכסן מידע כאשר מריצים את התוכנית. אם נרצה עוד זכרון עלינו לשמור את המידע בזכרון אחר ואחר כך לקרוא אותו בחזרה.
ג) אין if או switch , לולאות ואפילו קריאה לפונקציות, הכל ממומש באמצעות קונבנציות.
כפי שדיברנו ב x86-64 Assembly המשתנים מחולקים לפי גדלים החל מ 8 ביטים ואז 16 ואז 32 ולבסוף 64. בטבלת ייצוגים זה ייראה ככה
נשים לב שלfloat יש חומרה מיוחדת שמטפלת בו ולכן suffix אחרים.
בפעולות שאנחנו מבצעים נרצה להגיד לאסמבלר איזה ״חלק״ בזכרון נרצה לקחת. שכן הרגיסטר הוא 64 ביט אבל יש לו חלקים בתוכו שניתן לפנות אליהם.
נשים לב שניתן לעשות פעולות על רגיסטר או על קבוע , הסימונים שנעשה עליהם יעזרו לאסמבלר להבין האם מדובר בעבודה עם כתובת זכרון או בעבודה עם ערך.
כאשר עובדים עם כתובות בזכרון במערכת 64 סיביות, גודל הכתובת הוא 64 סיביות ולכן חייבים לעבוד עם quad word registers בכל הקשור לגישה לכתובת , לדוגמה לא אוכל לגשת לכתובת בהינתן רגיסטר של 32 סיביות כמו
השתיים הראשונים הם נטו להעברה של מידע מרגיסטר של 64 ביט לרגיסטר של 64 ביט.
movq יכול לעבוד בקומבינציות הבאות
כאשר אין תמיכה ב memory to memory . נשים לב שהסימון של זכרון אומר ״קח את הערך הזה תתייחס אליו ככתובת בזכרון ותביא לי את הערך בכתובת הזאת״
נשים לב שאחרי כל פקודה ניתן להוסיף גם איזה גודל של מידע נרצה להעביר ולאחר מכן נצטרך להביא register מתאים בגודל שציינו.
נשים לב שהפעולות הרשומות למעלה הן על quad word אבל יש להן פעולות שקולות על double word ו word ו byte בודד.
מה ההבדל בין arithmetic shift ל logical shift?
ה left shift הוא רגיל לשתי המקרים אבל בשיפט ימינה האריתמטי מרפד לפי הסימן כלומר ה msb , וה לוגי רק מזיז את הביטים ימינה ולכן יש סיכוי שהזזה של מספר שלילי עם שיפט ימינה תעשה אותו חיובי.
כמו שרשום בטבלה למעלה הפעולה
כאשר
זה נקרא effective address.
אם כן השמה של ערכים על פעולה כזאת אמורה להחזיר כתובת. כלומר האסמבלר מתייחס לזה ככתובת לא משנה איזה פעולה נפעיל עליו.
אבל אם נפעיל עליו mov אנחנו נבצע השמה לערך שבתוך הכתובת, ושימוש ב lea ישים פשוט את הכתובת, מכאן בא שמו ״load effective address״.
האחריות שלנו כמתכנים לדעת שבregister ששמנו ישנו ערך שעלינו להתייחס אליו ככתובת בזכרון.
לפעמים נשתמש ב lea כדי לבצע פעולות אריתמטיות בצורה מהירה יותר במקום להשתמש בפעולות האריתמטיקה שאנחנו שמצויינות למעלה.
פרט לפקודת הload effective address כל שימוש אחר בסינתקס של
משהו שחשוב לשים לב על פקודות הכפל והחילוק הנ״ל הן 2 דברים חשובים
כלומר מסתכלים עליהם כ oct word כלומר תוצאה בגודל 128 ביט.