כותב |
|
mikebb משתמש מתחיל
הצטרף / הצטרפה: 29 April 2011
משתמש: מנותק/ת הודעות: 11
|
נשלח בתאריך: 25 September 2011 בשעה 10:24 | | IP רשוּם
|
|
|
|
שלום,
רציתי לשאול למה כאשר אני בודק גודל כתובות בסי נוצר מצב ש-int הוא 4 בתים וכתובת היא גם 4 בתים (הבדיקה נעשית באמצעות sizeof) וכאשר אני שולח ערכים דרך פונקציה external ל-8086 אסמבלי דרך מחסנית הכתובת תופסת מקום של 2 כנ''ל גם ערך של int?
|
חזרה לתחילת העמוד |
|
|
inHaze משתמש פעיל
הצטרף / הצטרפה: 23 November 2006 מדינה: Israel
משתמש: מנותק/ת הודעות: 119
|
נשלח בתאריך: 25 September 2011 בשעה 12:08 | | IP רשוּם
|
|
|
|
8086 זהו מעבד שעובד בתצורה של 16bit, לכן integer תופס 2
בתים. במעבדים הנפוצים כיום integer תופס:
32bit - ארבעה בתים.
64bit - שמונה בתים.
__________________ הבלוג שלי
|
חזרה לתחילת העמוד |
|
|
mikebb משתמש מתחיל
הצטרף / הצטרפה: 29 April 2011
משתמש: מנותק/ת הודעות: 11
|
נשלח בתאריך: 25 September 2011 בשעה 15:58 | | IP רשוּם
|
|
|
|
כן אבל השאלה מה קורה לשני הבתים הנוספים שעוברים, אין מידע שהולך לאיבוד?
ואיך זה שב-c זה 4 ואז שזה עובר לאסמבלי פתאום זה 2? זה מוזר
|
חזרה לתחילת העמוד |
|
|
mikebb משתמש מתחיל
הצטרף / הצטרפה: 29 April 2011
משתמש: מנותק/ת הודעות: 11
|
נשלח בתאריך: 25 September 2011 בשעה 16:17 | | IP רשוּם
|
|
|
|
ואני חייב לציין שאני משתמש ב-amd athlon 64
|
חזרה לתחילת העמוד |
|
|
inHaze משתמש פעיל
הצטרף / הצטרפה: 23 November 2006 מדינה: Israel
משתמש: מנותק/ת הודעות: 119
|
נשלח בתאריך: 25 September 2011 בשעה 16:55 | | IP רשוּם
|
|
|
|
לגבי השאלה השניה שלך, הסיבה שב-c זה 4 ואז באסמבלי 2 היא
שכאשר אתה משתמש באסמבלי 8086 אתה בעצם עובד עם אימולטור
למעבד 16 ביט (אתה לא באמת עובד על מעבד 16 ביט), בעצם
האימולטור עצמו יודע לעשות את ההמרה הזאת.
איך הוא עושה את ההמרה? זאת שאלה טובה
__________________ הבלוג שלי
|
חזרה לתחילת העמוד |
|
|
mikebb משתמש מתחיל
הצטרף / הצטרפה: 29 April 2011
משתמש: מנותק/ת הודעות: 11
|
נשלח בתאריך: 25 September 2011 בשעה 17:16 | | IP רשוּם
|
|
|
|
רגע זה קשור לעובדה שהמעבד שלי הוא 64 ביט עם התקן של x86? הכוונה האם זה קשור לעובדה שיכול להיות שבמעבד שלי יש רכיב שהוא x86?
|
חזרה לתחילת העמוד |
|
|
inHaze משתמש פעיל
הצטרף / הצטרפה: 23 November 2006 מדינה: Israel
משתמש: מנותק/ת הודעות: 119
|
נשלח בתאריך: 25 September 2011 בשעה 18:03 | | IP רשוּם
|
|
|
|
אני לא חושב, יכול להיות שזה קשור לתמיכה של הסביבת פיתוח שלך
ב- 64 ביט.
__________________ הבלוג שלי
|
חזרה לתחילת העמוד |
|
|
mikebb משתמש מתחיל
הצטרף / הצטרפה: 29 April 2011
משתמש: מנותק/ת הודעות: 11
|
נשלח בתאריך: 25 September 2011 בשעה 22:08 | | IP רשוּם
|
|
|
|
אז איפה המעבד שלי נכנס לתמונה מישהו קצת יכול לעשות סדר בדברים?
|
חזרה לתחילת העמוד |
|
|
11010010110 פורומיסט על
הצטרף / הצטרפה: 23 April 2006
משתמש: מנותק/ת הודעות: 2621
|
נשלח בתאריך: 17 November 2011 בשעה 19:29 | | IP רשוּם
|
|
|
|
מבחינת המעבד עצמו הגודל של int הוא 32 ביט או 64 ביט בהתאמה
המערכת הפעלה, קומפיילר, אסמבלר, לינק וכדומה בנויים למעבד כלשהוא (שיכול להיות נמוך יותר) וינצלו את היכולות שלו בלבד מתוך המעבד שיש לך
למשל : כתבת תוכנה שבה יש int שבשלב כלשהוא מגיע ליותר מ 2^16
אם הקומפיילר, לינק, מערכת הפעלה וכו כולם עובדים ב 32 ביט, התוכנה תעבוד תקין
אם אחד מהם מוגבל ל 16 ביט, יקרה איבוד מידע (כל מה שמעבר ל 16 ביט יהיה 0, יתכן שיהיה או לא יהיה carry) ותקרה שגיאה בזמן ריצת התוכנה כשהיא תגיע למקום הזה - יתכן שלא תגלה אותה לעולם, תקבל נתונים לא נכונים בתוכנה ותגלה את זה בעתיד, תקבל קריסה מיידית, פעולה לא רצויה, לולאה אינסופית או כל תקלת תוכנה אחרת
הקומפיילר יכול אוליי להתערב בקוד של התוכנה ולתקן אותו בלי שתדע : למשל להחליף int ל long כשהוא רואה מקום מועד לבעיה תוך כדיי שהוא מקמפל, ואז התוכנה אוליי כן תעבוד גם ב "תנאים של 16 ביט" ואוליי לא
|
חזרה לתחילת העמוד |
|
|