200 likes | 353 Views
Assembly For X86. ייצוג מספרים ממשיים. ייצוג מספרים ממשיים. יצוג למספר אפס: כל הסיביות '0' כל מספר שונה מאפס: sign – סיבית סימן (0 – חיובי, 1 – שלילי) exponent – מספר שלם שהוא חזקה של 2 Significant – סדרה של ספרות בינאריות המיצגת מספר ממשי בין 1 ל- 1.99999..99. ייצוג בפועל.
E N D
Assembly For X86 ייצוג מספרים ממשיים
ייצוג מספרים ממשיים • יצוג למספר אפס: כל הסיביות '0' • כל מספר שונה מאפס: • sign – סיבית סימן (0 – חיובי, 1 – שלילי) • exponent – מספר שלם שהוא חזקה של 2 • Significant – סדרה של ספרות בינאריות המיצגת מספר ממשי בין 1 ל- 1.99999..99
ייצוג בפועל • לפי תקן IEEE • שלושה גדלים שונים: • 32 סיביות – single • 64 סיביות – double • 80 סיביות – long double
32 bit • Sign – 1 bit • Exponent – 8 bit • Signific – 23 bit • דיוק של 6-7 ספרות עשרוניות • ערך EXP הוא בתחום 126 – עד 127- • אין שימוש בערכים הקיצוניים כדי לאפשר ייצוג של NaN , INF
64 Bit • Sign – 1 bit • Exponent – 11 bit • Signific – 52 bit • דיוק של 61-15 ספרות עשרוניות • ערך EXP הוא בתחום 1022 – עד 1023-
80 Bit • Sign – 1 bit • Exponent – 15 bit • Signific – 52 bit • דיוק של 19-18 ספרות עשרוניות • ערך EXP הוא בתחום 16382 – עד 16383-
תחומים • עבור 32 סיביות: החזקות של 2 הם בתחום 127- עד 126 כלומר: • 1 * 2-127 = 1.175 * 10-38 • 1.99999.. * 2126 = 3.438 • עבור 64 סיביות: • 2.225 * 10-308 1.798 *10308 • עבור 80 סיביות: • 3.362 * 10-4932 1.189*104932
דוגמא • ייצוג המספר 1.625: • 1 * 20 + 1 * 2-1 + 0 * 2-2 + 1 * 2-3 • 1 + 0.5 + 0.125 • ערך ה – Significant יהיה 1101
בעיות דיוק • לא כל מספר ממשי ניתן לייצוג בינארי מדוייק. • בגלל חוסר הדיוק יגרמו שגיאות במהלך חישובים מרובים. • מספרים שניתנים לייצוג עשרוני פשוט אינם ניתנים לייצוג בינארי מדוייק.
בעיות דיוק • כל מספר חייב להיות מיוצג ע"י חזקות של 2: • 0.5 0.25 0.125 • 0.0625 0.03125 • 0.015625 0.0078125 • וכך ניתן להמשיך לנצח כאשר הדיוק גדל אבל לא מסתיים
המעבד המתמטי • פקודות המכונה הרגילות תומכות בפעולות על מספרים שלמים בלבד • במחשבי PC הראשונים פעולות במספרים ממשיים מומשו בתוכנה • המעבד המתימטי תומך בפעולות במספרים ממשיים ברמת המכונה. • שם אחר - FPU
סוגי מעבדים • לכל אחד מסוגי המעבדים היה מעבד מתמטי מתאים: • 8088 – 8087 • 80286 – 80287 • 80386 – 80387 • החל מ- 80486DX המעבד המתימטי כלול ב- CPU • אין הרבה הבדלים בין המעבדים המתמטים השונים.
ארכיטקטורה • 8 אוגרי מספרים – stack registers • Status Word Register • Control Word Register • Tag Word Register
Stack Registers • 80 סיביות – למספרים ממשיים • st(0) – st(7) • st(0) נקרא גם st • לכל אחד מהאוגרים הנ"ל יש 2 סיביות באוגר מיוחד שנקרא tag register • הסיביות מציינות את המצב של האוגר (מתוך 4 מצבים – ערך תקין, אפס, מיוחד, ריק)
Status Word Register – דומה לאוגר הדגלים של המעבד הראשי • Control Word Register – מכיל דגלים המשפיעים על תפקוד המעבד לדוגמא ניתן להוריד את מידת הדיוק מ – 80 סיביות ל- 32/64 • למרות שאוגרי הנתונים מכילים מספרים בייצוג 80 סיביות ניתן לבצע המרה ע"י פקודות. • לדוגמא הפקודה FILD מאפשרת לקרוא מהזיכרון מספר ממשי 32 סיביות לתוך st(i) • הפקודה FIST מבצעת את הפעולה ההפוכה
Tag Word 15 14 13 12 3 2 1 0 Tag(7) Tag(6) Tag(5) Tag(4) Tag(3) Tag(2) Tag(1) Tag(0) 00 – ערך תקין 01 – ערך אפס 10 – ערך מיוחד או בלתי חוקי (אינסוף, NAN) 11 - ריק
דוגמא .386 .387 _math_sub PROC NEAR push bp mov bp,sp fld dword ptr [bp+4] ; read into st fsub dword ptr[bp+8] ; st=st- b pop bp ret
Double push bp mov bp,sp fld qword ptr [bp+4] fsub qword ptr[bp+12]
Long Double push bp mov bp,sp fld tbyte ptr [bp+4] ; st <-- u fld tbyte ptr [bp+14] ; st <-- v ; st(1) <-- u fsubp st(1),st pop bp ret
פקודות • FLD - טעינת נתון • FADD - חיבור • FST - שליפת נתון • FILD - טעינת מספר שלם לאוגר ממשי • FIST - שליפת מספר שלם • FCOM - השוואה בין שני אופרנדים