basic commands in assembly

האסמבלי שעליו נכתב הסיכום הוא x86 עם סינתקס של at&t

אסמבלי לעומת שפה עילית

א) אין משתנים באסמבלי
1) כל המידע נשמר תחת אותם הregisters
2) צריך להבין מאוד טוב conventions כדי לא לטעות בניהול המידע.
3) הזכרון הוא פשוט מערך של בייטים.

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

ג) אין if או switch , לולאות ואפילו קריאה לפונקציות, הכל ממומש באמצעות קונבנציות.

איך משתנים נראים באסמבלי

כפי שדיברנו ב x86-64 Assembly המשתנים מחולקים לפי גדלים החל מ 8 ביטים ואז 16 ואז 32 ולבסוף 64. בטבלת ייצוגים זה ייראה ככה
Pasted image 20221222150654.png|350
נשים לב שלfloat יש חומרה מיוחדת שמטפלת בו ולכן suffix אחרים.
בפעולות שאנחנו מבצעים נרצה להגיד לאסמבלר איזה ״חלק״ בזכרון נרצה לקחת. שכן הרגיסטר הוא 64 ביט אבל יש לו חלקים בתוכו שניתן לפנות אליהם.

registers

operand forms

Pasted image 20221222185500.png|450
נשים לב שניתן לעשות פעולות על רגיסטר או על קבוע , הסימונים שנעשה עליהם יעזרו לאסמבלר להבין האם מדובר בעבודה עם כתובת זכרון או בעבודה עם ערך.

Note

כאשר עובדים עם כתובות בזכרון במערכת 64 סיביות, גודל הכתובת הוא 64 סיביות ולכן חייבים לעבוד עם quad word registers בכל הקשור לגישה לכתובת , לדוגמה לא אוכל לגשת לכתובת בהינתן רגיסטר של 32 סיביות כמו (eax)

move to

Pasted image 20221222185822.png|450
השתיים הראשונים הם נטו להעברה של מידע מרגיסטר של 64 ביט לרגיסטר של 64 ביט.

movq יכול לעבוד בקומבינציות הבאות
Pasted image 20221222190825.png|300
כאשר אין תמיכה ב memory to memory . נשים לב שהסימון של זכרון אומר ״קח את הערך הזה תתייחס אליו ככתובת בזכרון ותביא לי את הערך בכתובת הזאת״
נשים לב שאחרי כל פקודה ניתן להוסיף גם איזה גודל של מידע נרצה להעביר ולאחר מכן נצטרך להביא register מתאים בגודל שציינו.

פעולות אריתמטיות ולוגיות

Pasted image 20221222191653.png|300
נשים לב שהפעולות הרשומות למעלה הן על quad word אבל יש להן פעולות שקולות על double word ו word ו byte בודד.
מה ההבדל בין arithmetic shift ל logical shift?
ה left shift הוא רגיל לשתי המקרים אבל בשיפט ימינה האריתמטי מרפד לפי הסימן כלומר ה msb , וה לוגי רק מזיז את הביטים ימינה ולכן יש סיכוי שהזזה של מספר שלילי עם שיפט ימינה תעשה אותו חיובי.

load effective address

כמו שרשום בטבלה למעלה הפעולה

D(Rb,Ri,S)D+contents(Rb)+Scontents(Ri)

כאשר S הוא אחד מהערכים הבאים 1,2,4,8
זה נקרא effective address.

אם כן השמה של ערכים על פעולה כזאת אמורה להחזיר כתובת. כלומר האסמבלר מתייחס לזה ככתובת לא משנה איזה פעולה נפעיל עליו.
אבל אם נפעיל עליו mov אנחנו נבצע השמה לערך שבתוך הכתובת, ושימוש ב lea ישים פשוט את הכתובת, מכאן בא שמו ״load effective address״.
האחריות שלנו כמתכנים לדעת שבregister ששמנו ישנו ערך שעלינו להתייחס אליו ככתובת בזכרון.

לפעמים נשתמש ב lea כדי לבצע פעולות אריתמטיות בצורה מהירה יותר במקום להשתמש בפעולות האריתמטיקה שאנחנו שמצויינות למעלה.

הבחנה

פרט לפקודת הload effective address כל שימוש אחר בסינתקס של n(reg1,reg2,x) ישלח אותי לזכרון כאשר הכתובת היא מה שיצא בתוצאה

mul div

משהו שחשוב לשים לב על פקודות הכפל והחילוק הנ״ל הן 2 דברים חשובים

  1. בדיפולט , אם נותנים כקלט רק Source אז התוצאה מוכפלת עם rax וההשמה שלה נעשת לתוך שתי הרגיסטרים הבאים באופן הבא
R[rdx]:R[rax]

כלומר מסתכלים עליהם כ oct word כלומר תוצאה בגודל 128 ביט.

  1. לפעולות האלה יש וריאציות עבור signed ו unsigned כפי שניתן לראות בטבלה הבאה
    Pasted image 20221224000358.png|350