BRANCH ASSEMBLY כיצד זה עובד?

yosi44441

New member
BRANCH ASSEMBLY כיצד זה עובד?

אני רוצה להבין מספר דברים על הפונקציה B המתוארת כאן ,(branch)

1- ניתן לקפוץ מכל מקום בקוד(במסגרת מרחב הכתובות שההוראה מאפשרת) לכל מקום בקוד? או שניתן לקפוץ רק באותה הפונקציה?

2- מה ההבדל בין הוראה זו לבין goto

3- כמו שאני רואה הקפיצה היא לפי OFFSET כלשהו, אם כך מדוע בדוגמא שם (ובכל הדוגמאות של branch שראיתי כתוב branch ואז שם של תווית- מהיכן הגיע השם הזה? האם יש לו איזכור כלשהו בבינארי?
 

BravoMan

Active member
קודם כל זו לא "פונקציה".

זו פקודת מכונה.
היא מקבלת כתובת, וקופצת אליה.
&nbsp
אז התשובות הן:
1. לכל מקום בקוד.
ב-ASSEMBLY אין באמת פונקציות וזה לא כ"כ משנה. אתה קופץ לפקודה מסוימת וממשיך משם.
&nbsp
2. זו בדיוק פקודת goto. אין הבדל.
כמובן, אם אתה לא משתמש באופציה של תנאי.
&nbsp
3. את התווית אתה שם בקוד שלך.
הקומפיילר מתרגם את התווית לכתובת מספרית.
&nbsp
היא אינה נשמרת בגרסה המקומפלת של הקוד.
 

yosi44441

New member
אז בפועל אין LABEL בקוד האסמבלי ה B מקבל בסוף רק כתובת ?

מה הכתובת שהיא מקבלת?
הרי אם יש לי בינארי כלשהו איך אני יכול לדעת מה יהיה הכתובת של השורה שאליה אני רוצה לקפוץ?
 

BravoMan

Active member
אתה צריך להבין מה הוא "ASSEMBLY"

ASSEMBLY הוא ייצוג של שפת מכונה שקריא (פחות או יותר) לבני אדם.
&nbsp
האסמבלר מתרגם פקודות כמו B או ADD או MOV לקודים - פקודות מספריות שמעבד יודע לבצע.
בהתאם לסוג הפקודה והפרמטרים שלה (אופרנדים), תרגום של שורת אסמבלי יכול לקחת בית אחד או יותר.
&nbsp
כשאתה כותב קוד באסמבלי, אתה יכול לשים תוויות בתוך הקוד הזה כדי לסמן מקומות מסוימים בו, שתרצה לפנות אליהם אחר כך.
&nbsp
כשהקומפיילר יראה את התווית, הוא ידע לסמן את המקום בקוד, ובכל פניה הבאה אל התווית בקוד הוא יחשב את המרחב, בבתים, ממקום הפניה לתווית, ויציב את המספר התאים לפקודת הקפיצה.
 

selalerer

New member
זה טיפה יותר מורכב

ה-assembler בונה קובץ בינארי בפורמט מסויים בהתאם לארכיטקטורה שה-assembler מכוון אליה.
&nbsp
לפעמים כותבים לכרטיסים יעודיים ואז באמת יותר סביר שבבינארי יהיו כתובות אבסולוטיות.
&nbsp
לפעמים כותבים למערכת הפעלה קצת יותר high level ואז בד"כ ה-assembler שם offsetים מתחילת ה-binary וכאשר ה-loader של מערכת ההפעלה טוען את הבינארי לזיכרון ומכין אותו לריצה הוא מחליף את הכתובות לכתובות בפועל שהקוד נטען אליהן (בין אם הן וירטואליות או אבסולוטיות - התרגום הזה בכל מקרה נעשה כבר בחומרה ברמת המעבד).
 
למעלה