היסט - offset

היסט - offset

אני לומד את יסודות מבנה המחשב ותכנות באסמבלי, ולא כל כך נופל לי האסימון של ה"היסט" הזה.

נתנו לי כתרגיל פשוט, לקמפל את הפקודה הבאה בשפת C:
g = h + A[8]

כאשר :
g ו-h מאוחסנים באוגרים s0 ו-s1, בהתאמה.
A הוא מערך של 8 מילים.
באוגר s2 נמצאת הכתובת של A בזכרון.

התשובה הנכונה היא :
lw $t0, 32($s2)
add $s0, $s1, $t0

מה שלא הבנתי בפקודה הראשונה - אם באוגר s2 יש כתובת שבה נמצא הבית הראשון של המילה הראשונה, וחוץ ממנו יש עוד 31 בתים (כי יש לנו 8 מילים), אז למה "מוסיפים" 32 ולא 31?
ניסיתי לעשות קצת גוגל על ההיסט הזה ורק התבלבלתי עוד יותר...
כל עזרה תתקבל בברכה


תודה!
 

הפרבולה

New member
תשובה

אם המצביע S2 מכיל את הערך 0 שזה הכתובת של הבית הראשון במערך,( חץ אדום בציור ), כלומר S2 מצביע על תחילת המערך, אז כמה צריך להוסיף לו כדי שהוא יצביע על הבית ה 32 ( מסומן כ P עם חץ כחול בציור ) ? כלומר כמה צריך להוסיף לו כדי שידלג 8 מילים ( מילה = 4 בתים ), לדעתי ההיסט הוא 32 ( ולא 31 ).

אגב לפי מה שאמרתה יש פה גלישה מחוץ לגודל המערך A שכן אמרתה שהוא בעל גודל 8 מילים שזה 32 בתים, והוספת היסט של 8 מילים ( = 32 בתים) מצביעה על כתובת בית אחד מעבר לו.

 
נו, אז זה בדיוק מה שאמרתי....


בפסקה האחרונה שלך בדיוק עלית על הבעיה - אם ההיסט הוא של 32, אז יהיה לנו בית עודף!
אבל אני שם לב שבתרגילים כאלה ההיסט הוא תמיד כפולה של 4, כלומר במקרה שלנו ההיסט יהיה 8 כפול 4, כלומר 32. וזה מה שלא מסתדר.

אגב, אני בטוח טועה, ההיסט הוא לא 31.
אני רק צריך הסבר למה זה 32, את זה עדיין לא הבנתי.
 

BravoMan

Active member
הבעיה היא בתרגיל המקורי, לא בספירה:

אם יש לך מערך של 8 יחידות (לא משנה אם זה בתים או "מילים" בגודל 4 בית כל אחת), בשפת C אינדקס 8 אינו חוקי, כי האינדקסים מתחילים מ-0, אז האחרון יהיה 7.
&nbsp
או שיש טעות דפוס בתרגיל, או שהעתקת לא נכון.
&nbsp
בכל אופן, היות ואתה עובד עם מילים, הסט של 31 הוא חסר משמעות - הוא יביא אותך לבית האחרון של המילה ה-8
בדיוק כמו שהסט של 3 יביא אותך לבית האחרון של המילה הראשונה.
&nbsp
היסט של 32 מביא אותך לבית הראשון של המילה ה-9.
&nbsp
והבית הראשון של המילה ה-8? יהיה 4 * 7 -> האינדקס של המילה (זכור, שלמילה ראשונה, אין הסט, וגם יש אינדקס 0 מה שמסתדר בדיוק). אז, ה-"מילה" השמינית מתחילה בהיסט 28.
&nbsp
הסיבה שהתשובות הן תמיד כפולה של 4 היא שבתרגילים שלך עובדים עם מילים בגודל 4 (מה שמקובל במעבדים 32 סיביות), ואין לך תרגילים שמבקשים לקפוץ לאמצע המילה, או לטפל במילה שאינה מיושרת כהלכה בזיכרון.
 
או קיי....

אז הנה בדיוק הנקודה : הבנתי שהיסט של 32 יביא אותי לבית הראשון של המילה ה-9, אבל האם הוא יקרא אותה? כי הבית הזה לא מעניין אותי.
במילים אחרות - היסט מביא אותי עד כתובת מסוימת כולל הכתובת הזאת, או "לא כולל" ?
 
הבנתי את עניין ההיסט, עכשיו יש בעיה אחרת


דבר ראשון העתקתי לא נכון, זה מערך של 9 מילים! תודה

אחרי שהבנתי את עניין ההיסט, הבנתי שמשהו אחר בילבל אותי - אני חושב שלא הבנתי את ההוראה ב-C.
מה הכוונה של חיבור משתנה למערך? מה אמור להיכנס למשתנה g בדוגמא שהבאתי?
אגב, בתרגיל הבא, הפקודה שצריך לקודד ב-C היא :
A[12] = h + A[8]

אם אני לא מבין מה קורה בפקודה ב-C, אין סיכוי שאצליח לקמפל לאסמבלי...
אשמח לעזרה בעניין.
המון תודה!!!
 

BravoMan

Active member
אין דבר כזה "חיבור משתנה למערך"

בדוגמה הראשונה, מחברים את הערך ב-h לערך בתא האחרון (תא 9 הנמצא באינדקס 8 במערך) ושומרים את התוצאה ב-g.
בדוגמה השנייה , עושים את אותו חיבור, אבל שומרים אותו בתא 13 (אינדקס 12) במערך A.
&nbsp
שים לב, שכדי שזה יהיה חוקי, המערך A בדוגמה השנייה צריך להיות לפחות בגודל 13 תאים!
&nbsp
בשפת C, פניה לתא במערך לצורך שליפת ערך ממנו או אחסון ערך בו נעשים ע"י ציון שם המערך ואחריו בסוגריים מרובעות אינדקס של אותו תא.
אפשר להתייחס לכל תא במערך כמשתנה בודד מאותו סוג כמו המערך.
&nbsp
למשל, אם מדובר במערך של -int (שזה בערך "מילים" של 4 בית) אז כל תא בו הוא כמו משתנה Int בודד (מילה של 4 בית).
&nbsp
בפועל, המערך הוא מקטע זיכרון רציף. המשתנה "שמחזיק" את המערך, כמו A, מחזיק למעשה את הכתובת של התא הראשון.
האינדקס משמש לחישוב היסט.
מכפילים את האינדקס בגודל של כל תא, ומקבלים את הכתובת בזיכרון של התא הרצוי.
&nbsp
בעניין ההיסט - רק כדי לוודא שהבנת נכון:
חישוב ההיסט עצמו אינו קורא או כותב שום דבר כמובן.
&nbsp
אבל כתובת שמתקבלת היא תמיד של התא ממנו מתחילים לעבוד.
למשל, אם קיבלת כתובת 32, זה אומר שכל פקודה (קריאה, כתיבה וכו') שתפעיל על הכתובת הזו תיקח בתור הבית הראשון את הבית בכתובת 32, שבדוגמה הראשונה הוא הבית הראשון של המילה התשיעית.
&nbsp
או בצורת ניסוח הקצת עקומה, אפשר לומר שזה "כולל".
 
למעלה