Presentation is loading. Please wait.

Presentation is loading. Please wait.

תכנות בסיסי בשפת סף פרק 5 מצגת 3.

Similar presentations


Presentation on theme: "תכנות בסיסי בשפת סף פרק 5 מצגת 3."— Presentation transcript:

1 תכנות בסיסי בשפת סף פרק 5 מצגת 3

2 תכנות בשפת סף ההבדל הבולט בין שפת סף ושפות עיליות כמו פסקל ו- C הוא שההוראות כוללות התייחסות ישירה לרכיבי המחשב כמו אוגרים וזיכרון ולכן חשוב להכיר את המודל התכנותי של המעבד 8086 כתיבת תכניות כדי לכתוב יישומים פשוטים לממש מבני תכנות של שפות עיליות הוראות שייכות לקבוצות ההוראות הבאות: הוראות העברה הוראות אריתמטיות הוראות לוגיות הוראות הזזה וסיבוב

3 קבוצת הוראות העברה ההוראהMOVe
MOV destination, source משמעותה: destination = source כלומר, תוכן אופרנד מקור מועתק אל אופרנד היעד צירופי אופרנדים לא קיים הצירוף בו שני האופרנדים הם תאים בזיכרון !!

4 קבוצת הוראות העברה ההוראהMOVe
XCHG destination, source משמעותה: destination  source כלומר, תוכן אופרנד מקור מוחלף עם תוכן אופרנד היעד צירופי אופרנדים

5 תרגיל מטרת התכנית הבאה היא לבצע החלפה סיבובית בין שלושה משתנים במוגדרים במקטע נתונים בצורה הבאה: .data a db 12h b db 34h c db 78h כאשר ערכו של a כל משתנה מוחלף עם ערך המשתנה הסמוך לו: כלומר a מוחלף עם b , b מוחלף עם c, ו- c מוחלף עם a. בסיום התכנית ערכי המשתנים צריכים להיות: a = 78h b = 12h c = 34h האם ההוראות הבאות מבצעות את הנדרש? אם לא תקנו את התכנית כך שתשיג את מטרתה. MOV AL, a XCHG AL, b XCHG AL , c

6 הוראות אריתמטיות - חיבור וחיסור
הוראות אריתמטיות - חיבור וחיסור ביצוע הוראות\ייצוג מספרים עם סימן וללא סימן אוגר דגלים והשפעה של הוראות על אוגר דגלים הוראות: ADD, SUB, ADC, SBB, INC, DEC מבני בקרה: תנאי ולולאה

7 הוראות אריתמטיות - חיבור וחיסור
הוראות אריתמטיות - חיבור וחיסור הדיון בקבוצת הוראות זו נתחיל בהצגת הוראות לחיבור וחיסור, בהן נשתמש לביצוע הוראות השמה מהסוג: ביטוי אריתמטי = משתנה כאשר ביטוי אריתמטי כולל פעולות חיבור וחיסור בלבד. לדוגמה, נכתוב קטע תכנית בשפת סף שיבצע את שלושת הוראות ההשמה הבאות: a= a+ b – c b= c b c= 2*c נתון כי a, b ו- c הם משתנים בזיכרון מטיפוס בית ובעלי הערכים התחיליים הבאים: a = 38, b=23, c=36

8 הוראות אריתמטיות - חיבור וחיסור
הוראות אריתמטיות - חיבור וחיסור    חיבור – (addition) ADD add destination, source שמשמעותה: destination = destination + source חיסור– SUB (subtract) sub destination, source שמשמעותה: destination = destination – source

9 הוראות אריתמטיות - חיבור וחיסור
הוראות אריתמטיות - חיבור וחיסור   צירופי אופרנדים אפשריים

10 מספרים מוצגים בשיטה הקסהדצימאלית שמות משתנים הוחלפו בכתובות
.model small .stack 100h .data a DB 38 b DB 23 c DB 36 .code start: mov ax, @DATA ; אתחול מקטע הנתונים mov ds, ax ; a= a+b-c mov al, a add al, b sub al, c mov a, al ;b= c b mov al, c sub al, 20 mov b, al ;c= 2*c = c + c add c, al mov ax, 4c00h ; terminate program int h end start מספרים מוצגים בשיטה הקסהדצימאלית שמות משתנים הוחלפו בכתובות

11 נשנה נתונים: a=171, b= 201, c= 78 ונחשב שוב: a=a+b-c= 171+201-78= 294
AL= 26h ???

12 גלישה מתחום ערכים מה השתבש, מאין נובעת הטעות בחישוב?
 הטעות בחישוב נובעת מכך, שלא התחשבנו בכך שתחום הערכים שניתן לאחסן בבית אחד הוא בין 0 ל- 255 עשרוני. נעקוב אחר ביצוע ההוראות:  MOV AL, a ; AL = 172d ADD AL, b ; AL = 172d + 201d = ? איך המחשב מבצע חיבור בינארי?

13 פעולת חיבור בינארי מספרים שלמים ללא סימן
חיבור של שני מספרים, מבוסס על לוח החיבור  

14 חיבור בינארי – שיטה מהירה
בשלב הראשון מחברים כל אחת מן הספרות של המספר הראשון עם הספרה המתאימה לה במספר השני. אם יש נשא, כותבים אותו בשורה שמתחת לשורת התוצאה, כשהוא מוסט במקום אחד שמאלה. בשלב הבא מחברים את שורת הנשא לשורת התוצאה. כך חוזרים על שתי פעולות אלו עד ששורת הנשא נותרת ריקה. נמחיש את התהליך באמצעות הדוגמה הבאה:

15 גלישה מתחום הסיבית התשיעית "נפלה" והערך שאוחסן באוגר AL בסופו של דבר הוא : AL = = 117d בהתאם לכך , הפעולה השלישית: SUB AL ,c ; AL = 117d – 78d = 35d = וכך קיבלנו את הטעות בתוצאה.

16 התאמת טיפוס לתחום ערכים
כדי לפתור בעיה זו אנו יכולים להגדיר משתנה מטיפוס מילה או מילה כפולה וכך להגדיל את תחום המספרים בהם ניתן לטפל. גם בשפות עיליות מוגדרים מספר סוגים טיפוס שלם לדוגמה: byte, integer, word, longint. כל אחד מהם מגדיר מספר בתים בזיכרון ומכאן גם תחום ערכים אפשרי. לדוגמה משתנה מטיפוס byte בדרך מוקצה בית אחד ולכן תחום ערכים אפשרי הוא בין 0 ל- 255, משתנה מטיפוס integer מוקצים לעיתים 2 בתים ובהתאם תחום ערכים משתנה בין 0 ל

17 חריגה ושימוש באוגר דגלים
 כדי לטפל בחריגה של תוצאת פעולת חיבור מהתחום האפשרי באופרנד היעד, המעבד 8086 מספק מידע שהתוצאה "גלשה". מידע זה נשמר בדגל הנשא שהוא חלק מאוגר הדגלים

18 מספרים שליליים נשנה את הנתונים ונריץ שוב: a=a+b-c a=38+(-23)-25=
-10 = -0Ah ערך -23 הומר ל- 9E AL=F6

19 ייצוג מספרים שלמים עם סימן
שיטה זו להצגת מספרים שליליים הנקראת שיטת הגודל והסימן בה משתמשים בספרה המשמעותית ביותר לסימן: 0 מספר חיובי 1מספר שלילי בעיות לאפס יש שני ערכים חישוב שגוי: -4+1   1100 + 1 1101 = -5 או 1+(-1)=0? = 1010

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

21 ייצוג מספרים שלמים עם סימן – שיטת המשלים ל- 2 (two's complement)
נחפש ייצוג בו ייצוג של מספר שלילי יהיה כזה שחיבור 0= (a + (-a לדוגמה, 3+ (-?) = 0 ???? 2 00002

22 ייצוג מספרים שלמים עם סימן – שיטת המשלים ל- 2 (two's complement)
לכאורה אם המספרים הם בני 4 סיביות למשוואה זו אין פתרון. אך אם נבחר לייצג את המספר אפס באמצעות 5 סיביות: , אזי למשוואה זו יש פתרון ובה המספר מייצג את 3-. כעת נחשב את הסכום (3-) נקבל 0 המיוצג על ידי מספר בן 5 סיביות ונתעלם מהסיבית החמישית: 11012 100002

23 ייצוג מספרים שלמים עם סימן – שיטת המשלים ל- 2 (two's complement)
נוכל לחשב את הערך השלילי x של מספר על ידי החסרת הערך המוחלט שלו מאפס: | x | מסובך, שיטה אחרת לחישוב משלים ל-2: הפוך כל סיבית 0101  1010 הוסף 1 לתוצאה+ 1 1011

24 ייצוג מספרים שלמים עם סימן – שיטת המשלים ל- 2 (two's complement)
1.  עבור על כל הסיביות של המספר החל מהספרה הפחות משמעותית (LSB), עד שתגיע לסיבית הראשונה שהיא 1 2.  הפוך את ערכן של כל הסיביות משמאלה של הסיבית שנמצאה בשלב 1. דוגמה: -6 נהפוך את הספרות אחרי 1 6 = משלים ל- 2 של 6- =1010 באדום סיביות ללא שינוי

25

26 N - 1 1 N - 2 2 (a) Circle representation of integers mod N 0000 1111 0001 1110 0010 - 1 + 1 - 2 + 2 1101 0011 - 3 + 3 1100 - 4 + 4 0100 - 5 + 5 1011 0101 - 6 + 6 - 7 + 7 1010 - 8 0110 1001 0111 1000 (b) Mod 16 system for 2's-complement numbers

27 חיבור/חיסור מספרים עם סימן
תחילה נהפוך מספר עם סימן למספר בשיטת משלים ל- 2 ונבצע חיבור דוגמה: 23 –13 = 23 + (-13) מתעלמים מהספרה הנוספת

28 תחום ייצוג מספרים שלמים
מספר ללא סימן מתייחסים לערכים החל מ- 0 ועד N: 0.. 2n-1 בבית n=8 במילה n=16 מספר עם סימן מחלק את הערכים בתחום ל"שני" חלקים: - 2n n-1 בבית: במילה

29 ANSI C Integer Data Types
Integer Type Minimum Maximum signed char -127 127 unsigned char 255 short int -32,767 32,767 unsigned short 65,535 int unsigned int long int -2,147,483,647 2,147,483,647 unsigned long 4,294,967,295

30 גלישה בחיבור מספרים בשיטת המשלים ל- 2
מתרחשת באחד משני המקרים: סכום שני מספרים חיוביים התקבל כשלילי למשל בייצוג מטיפוס nibble : 4+5= =1001 קבלנו תוצאה 1001, זהו הייצוג של 7- ב- 4 סיביות סכום שני מספרים שליליים התקבל כחיובי למשל בייצוג מטיפוס nibble : (-2)+(-7)= =10111 קבלנו סיבית חמישית בה לא מתחשבים ולכן הסיבית הרביעית היא סיבית הסימן

31 שימוש באוגר דגלים אוגר הדגלים הוא אוגר בן 16 סיביות, וכל סיבית בו משמשת בתפקיד של דגל המציג מצב מסוים שהתקבל כתוצאה מביצוע הוראה כלשהי בשפת סף מה ניתן ללמוד מתוצאת החישוב? האם התוצאה גלשה האם התוצאה אפס האם המספר עם סימן או ללא סימן

32 דגל נשא – Carry Flag - CF תפקיד דגל הנשא להצביע על גלישה שהתרחשה כתוצאה מפעולה עם מספרים לא מסומנים, ובהתאם: דגל הנשא יונף, ערכו יקבע כ: CF=1, אם גודל תוצאת החישוב חרגה מגבולות מתחום הערכים המותר באופרנד היעד דוגמה: MOV AL, 2 ;AL=2 ; אין שינוי במצב הדגלים ADD AL, 0FFh ; AL= 1, CF=1

33 דגל נשא – Carry Flag - CF עבור מספר ללא סימן חריגה מהתחום
לדוגמה אופרנד הוא מטיפוס בית, גלישה תתקבל אם המספר גדול מ- 255 או קטן מ- 0 בפעולת חיבור המונח גלישה בחיבור הוא ברור יותר, אבל מה המשמעות של גלישה בעקבות פעולת חיסור? בפעולת חיסור גלישה מתקבלת במקרה בו המחסר גדול מהמחוסר ויש שימוש בלווה, לדוגמה: 2- 0FFh = -0FDh בביצוע פעולה זו, התוצאה גולשת מתחום של בית אחד ולכן דגל הנשא יונף. החישוב שהתבצע: 2- 0FFh = 2 + (-0FFh)= 2 + (01)= 03 שהוא הייצוג של –0FDh

34 שימוש בדגל נשא לחיבור אורך ADC
אפשר להשתמש בדגל הנשא לחיבור או חיסור מספרים שגולשים מתחום המתאים לטיפוס האופרנד, ולשם כך קיימות במעבד 8086 שתי הוראות נוספות: חיבור עם נשא וחיסור עם נשא.   ( ADC (Add with Carry: ADC destination, source שמשמעותה: destination = destination + source + CF צירופי האופרנדים האפשריים בהוראת ADC הם בדומה לצירופים האפשריים שהוצגו בהוראה ADD.

35 שימוש בדגל נשא לחיבור אורך ADC
לדוגמה חיבור אופרנדים מטיפוס מילה: אם נחבר את שני הערכים המקסימאליים שניתן לאחסן במילה 0FFFFh + 0FFFFh = 1FFFEh נקבל תוצאת חיבור של שני ערכים כאלו יכולה להיות בת 17 סיביות, ולכן כדי לאחסן את התוצאה של פעולה זו, עלינו השתמש בשני אופרנדים מטיפוס מילה, כאשר: אופרנד AX יכיל את 16 הסיביות הנמוכות בתוצאה ואופרנד DX את הסיבית ה- 17.

36 שימוש בדגל נשא לחיבור אורך ADC
;ax= 0F1A3h+ 0AF0Dh MOV DX, ; DX =0 MOV AX, 0F1A3h ; AX = 0F1A3h ADD AX, 0AF0Dh ; AX = 0F1A3h + 0AF0Dh = 0A0B0h, CF=1 ADC DX ,0 ; DX = 0+CF =1, CF=0 ובסיום התוצאה מורכבת מערכי שני האוגרים: DX:AX=1A0B06h

37 שימוש בדגל נשא לחיסור עם לווה SBB
באופן דומה קיימת הוראת חיסור עם לווה –( SBB (subtract with borrow : sbb destination, source שמשמעותה: destination = destination – source – CF חסר מאופרנד היעד את הערך השמור באופרנד המקור ואת דגל הנשא ואחסן את התוצאה באופרנד היעד, כאשר דגל הנשא מתפקד בהוראות אלה כדגל הלווה (Borrow).

38 שימוש בדגל נשא לחיסור עם לווה SBB
דוגמה:

39 דגל הסימן Sign Flag (SF)
דגל הסימן:   מונף אם הסיבית המשמעותית ביותר היא 1 (כלומר מספר שלילי) והדגל מורד אם הסיבית המשמעותית ביותר היא 0 (כלומר מספר חיובי)

40 דגל הסימן Sign Flag (SF)
תרגיל לדוגמה: יש לכתוב קטע של תכנית המחשב את גובה מפלס מי הכנרת. ידוע הקו האדום העליון של מפלס הכנרת נקבע ל: 208- מטר. בינואר גובה המפלס היה -214 מטר ומאז ועד היום עלה המפלס ב- 5 מ'. התכנית תחשב: א. את גובה מפלס מי הכנרת כיום ? ב. כמה מטרים חסרים מהמפלס היום כדי שהמפלס יעמוד על הקו האדום?

41 דגל הסימן Sign Flag (SF)
פתרון : תחילה נגדיר את המשתנים הדרושים לאחסון גובה המפלס הנוכחי והקו האדום. נזכור כי תחום מספרים עם סימן שניתן לאחסן בבית הוא בין +127 לבין -128, ולכן כדי לאחסן את הנתונים על מפלס מי הכנרת נגדיר משתנים מטיפוס מילה:    .DATA waterlevel DW d ; = 0FF2Ah redline DW d ; = 0FF30h המספרים השליליים מיוצגים בשיטת המשלים ל- 2.

42 כעת נרשום את ההוראות לביצוע החישובים:
MOV AX, waterlevel ; AX = 0FF2Ah דגלים לא מושפעים מפעולת העברה ADD AX , 5 ; AX= AX + 5 = 0FF2Fh ,SF=1 , CF=0 SUB redline, AX ; redline = redline –AX = 0FF30h- 0FF2Fh = 01h ; SF=0, CF=0 בשתי הוראות: חיבור וחיסור תוצאה היא שלילית ולכן דגל הסימן מונף.

43 הוראה לחישוב המשלים ל –2 : NEG
כדי לייצג מספרים בשיטת משלים ל- 2 , ניתן להשתמש בהוראה מתאימה: ההוראה ( neg (negate neg destination שמשמעותה: destination = 0 - destination אחסן באופרנד היעד את המשלים לשתיים של הערך שמאוחסן בו. לדוגמה, אנו יכולים לאחסן את הערך 208 במשתנה redline , redline DW 208d ולהשתמש בהוראה neg כדי להציג את הערך השלילי -208 בשיטת המשלים ל- 2: NEG redline ; redline = 0FF30h

44 דגל גלישה במספרים מסומנים Overflow Flag (OF)
תוצאת חישוב עם מספרים מסומנים יכולה ליצור תוצאה שגולשת מגודל אופרנד היעד. נזכור במספרים מסומנים:   בבית אחד תחום המספרים המסומנים הוא בין 127+ ל- -128 במילה תחום המספרים המסומנים הוא בין ל בהתאם לכך דגל הגלישה OF: יונף אם גודל האופרנד הוא בית ותוצאת החישוב תהיה גדולה מ- 128 או קטנה מ , או באופרנד שגודלו הוא מילה דגל הגלישה יונף אם תוצאת החישוב תהיה גדולה מ או קטנה מ

45 דגל גלישה במספרים מסומנים Overflow Flag (OF)
לדוגמה, במדידות טמפרטורה שהתבצעו ברוסיה, נמדדה בקיץ טמפרטורת שיא של 65 מעלות ואילו בחורף הטמפרטורה הנמוכה ביותר היתה -75 מעלות. יש לכתוב קטע של תכנית שתחשב את הפרש טמפרטורות בין הקיץ לחורף. פתרון- הגדרת נתונים: summer DB 65d ;=41h winter DB -75d ;=0B5h

46 דגל גלישה במספרים מסומנים Overflow Flag (OF)
הוראות לביצוע החישוב: MOV AL, summer ; AL = 41h SUB AL, winter ;AL = 41h-B5h = 8Ch, OF=1, SF=1  דגל הסימן SF הוא 1 משום שהסיבית המשמעותית ביותר היא 1 ואילו דגל הגלישה OF מסמן שהתוצאה חרגה מתחום הערכים המסומנים שניתן לאחסן בבית אחד, ואכן: 65 – (-75) = 140 > 127

47 דגל גלישה במספרים מסומנים Overflow Flag (OF)
נשנה את הגדרת המשתנים למשתנים מטיפוס מילה ובהתאם להשתמש באוגרים בני 16 סיביות. נרשום גרסה מתוקנת לקטע תכנית זה: הגדרת נתונים: summer DW 65d ;=41h winter DW -75d ;=0FFB5h הוראות לביצוע החישוב: MOV AX, summer ; AL = 41h SUB AX, winter ;AL = 41h-B5h = 008Ch, OF=0, SF=0 כעת, ערך תוצאה 140 < ולכן דגל הגלישה OF מורד. חשבו: מדוע גם דגל הסימן מורד?

48 לאילו דגלים אנו מתייחסים?
בתכנון ארכיטקטורת ההוראות של מעבד 8086, נקבע לכל הוראה סוגי דגלים שיושפעו מביצועה. דגלים אלו משתנים בהתאם לתוצאה שהתקבלה מבצוע ההוראה, המתכנת מחליט אם להתייחס אליהם ואם לאו. לדוגמה, בתכנית לחישוב הפרש טמפרטורות, לא התייחסנו לדגל הנשא CF, אך אם נבחן את ערכו נבחין כי בביצוע שתי פעולות החיסור שהצגנו, ערכו הוא CF=1, משמע התוצאה גלישה מגודל של בית במקרה הראשון ומגודל של מילה במקרה השני. אולם המספרים בהם השתמשנו היו קטנים מ- 255, כיצד אם כך, התרחשה גלישה?

49 לאילו דגלים אנו מתייחסים?
אם נתייחס למספרים כאל מספרים מסומנים, בגרסה הראשונה של חישוב הטמפרטורות בה משתנים הם מטיפוס בית אחד, החישוב שבוצע היה: 41h –B5h < 0 כלומר היה לווה ולכן דגל הנשא מורם. באופן דומה בגרסה השניה, בה משתנים מטיפוס מילה, החישוב שבוצע היה: 41h –0FFB5h < 0 ולכן דגל הנשא מורם.

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

51 דגל האפס Zero Flag (ZF) דגל נוסף המושפע מפעולת אריתמטיות הוא דגל האפס.
דגל האפס מונף כאשר תוצאת החישוב היא אפס דגל האפס מורד כאשר תוצאת החישוב שונה מאפס. לדוגמה: MOV AL, 10h SUB AL, 10h ; AL= 10h – 10h =0 , ZF=1

52 דגלים נוספים שמושפעים מביצוע הוראות אריתמטיות
שני דגלים נוספים הקיימים בקבוצת דגלי המצב אותם נזכיר (אך לא נשתמש בהם בשלב זה) הם:   דגל נשא למחצה - AF . דגל זה מונף כאשר קיים נשא בין סיבית 3 לסיבית רביעית (בין low nibble ל- high nibble). דגל זוגיות – PF, מונף כאשר בבית התחתון מספר סיביות שהן 1 הוא זוגי והוא משתמש בתקשורת לבדיקה האם בית ששודר ממחשב למחשב התקבל בצורה תקינה.

53 הוראות בקרה תהליך ביצוע תכנית לא תמיד סדרתי
הוראות מותנות לולאות אלו דוגמאות למקרים בהם צריך לשנות סדר ביצוע הוראות, ולא תמיד לעבור להוראה הבאה במעבד קיימת קבוצת הוראות להעברת בקרה. את קבוצת ההוראות להעברת בקרה ניתן לחלק לשני סוגים: הוראות בהן בקרת התכנית עוברת לכתובת המטרה ללא תלות בקיום תנאים מסוימים הוראות בהן בקרת התכנית עוברת לכתובת המטרה רק אם התקיימו תנאים מסוימים.

54 הוראות בקרה דוגמה: חשב sum = x+y אם sum=0 אזי sum =10 סיום-אם

55 הוראות בקרה .model small . STACK .DATA x db 24 y db -24 .CODE start:
.CODE start: ; אתחול מקטע נתונים MOV AX, @DATA MOV DS, AX ; x+y MOV AL, x ; AL=x ADD AL, y ; AL =x+y ; x+y <> 0 JNZ next ;if ZF<> 0 then jump to next ; x+y = 0 MOV AL, 10 next: MOV AX, 4ch ; terminate program INT h END start הוראות בקרה

56 JNZ next; if ZF<>0 then jump to next
הוראות בקרה  הסבר: לפני שימוש בהוראת קפיצה יש לבצע הוראה שקובעת את ערך הדגלים הנבדקים. בתכנית שהצגנו ביצוע הוראה: ADD AL, x ; AL= 24+(-24)=0 , ZF=1 משנה את מצב הדגלים וביניהם גם את מצב דגל האפס ZF אותו אנו מעוניינים לבדוק. ההוראה הבאה מבצעת את הבדיקה הלוגית: האם x<>y , ובודקת האם דגל האפס מורד ואם כן התכנית קופצת לתווית next: JNZ next; if ZF<>0 then jump to next מאחר וסכום x+y הוא 0, אזי דגל האפס מורם ולכן בדיקת התנאי (דגל האפס) נכשלת והביצוע ממשיך מהוראה הבאה: MOV AL, 10

57 הוראות קפיצה מותנית המבנה של כל הוראות הקפיצה דומה, והוא מכיל אופרנד אחד המציין תווית של ההוראה שיש לדלג אליה. JXXX label השמות המנמוניים של ההוראות האלה מתחילים באות J; המשך השם XXX מרמז על התנאי לקפיצה. כאשר התכנית הכתובה בשפת סף תתורגם לשפת מכונה, התווית תתורגם לכתובת של ההוראה אליה מוצמדת התווית. הגדרת תווית נעשית על ידי מתן שם ולאחריו שימוש בנקודתיים : labelname:

58 הוראות קפיצה מותנית במעבד 8086 יש אילוץ על המרחק אליה ניתן לקפוץ:
כל הקפיצות המותנות חייבות להתבצע למען שאת מרחקו בינו לבין מען פקודת הקפיצה המותנית עצמה ניתן לרשום בבית אחד, בייצוג עם סימן. כלומר, הקפיצה יכולה להיות עד 127 בתים קדימה, או עד 128 בתים אחורה. קפיצה למרחק גדול יותר תוגדר על ידי המהדר כשגיאה. במידה ואנו רוצים לבצע קפיצה למרחק גדול יותר, אנו יכולים להשתמש בשתי הוראות: תחילה לבצע קפיצה מותנית למען חוקי ובו לרשום הוראה לקפיצה בלתי מותנית לכל יעד בסגמנט הקוד. כל ההוראות הללו אינן משנות את מצב הדגלים.

59 הוראות קפיצה מותנית את הוראות הקפיצה ניתן לחלק לשלושה סוגים:
א.      הוראות קפיצה עבור מספרים ללא סימן ב.       הוראות קפיצה עבור מספרים עם סימן ג.        הוראות קפיצה הבודקות ערך של דגל מסוים

60 הוראות קפיצה מותנית

61 הוראות קפיצה מותנית לכאורה יש כפילות בהוראות קפיצה מותנות עבור מספרים ללא סימן ועבור מספרים עם סימן. כדי להבין מדוע אנו זקוקים לאוסף הוראות נפרד לכל מקרה נתבונן בדוגמה הבאה. קטע התכנית הבא מבצע את האלגוריתם הבא: אם AL < AH אזי INC AH סיום-אם כלומר אם AL < AH אזי ערכו של AH יגדל ב- 2, אחרת ערכו יגדל ב-1.

62 הוראות קפיצה מותנית MOV AL, 11111110b MOV AH, 00000010b
SUB AL, AH ; CF=0, SF=1, OF=1 ; AL < AH JB ; if AL<AH then jump next : AL >= AH INC AH next: INC AH

63 הוראות קפיצה מותנית אם אנו מתייחסים לנתונים אלה כאל מספרים ללא סימן אזי AL > BL. במקרה כזה אנו משתמשים בהוראת הקפיצה JB next מאחר ו- AL לא קטן מ- BL הבדיקה נכשלת והביצוע עובר להוראה הבאה . וערכו של AH יגדל ב- 2 . כעת נשנה את הוראת הקפיצה ובמקום JB next ונרשום הוראת קפיצה מותנית למספרים עם סימן: JL next ומאחר בהתאם לערכים עם סימן, AL קטן מ- BL ולכן בעקבות התנאי נקפוץ להוראה אליה מוצמדת התווית next. במקרה כזה ערכו של AH יגדל ב- 1.

64 הוראות קפיצה הבודקות ערך של דגל מסוים
בחירת סוג הוראת הקפיצה המותנית תלויה בטיב הבעיה אותה אנו פותרים, ולעיתים קרובות קיימות מספר הוראות קפיצה שונות שמתאימות לאותה בעיה

65 הוראת השוואה CMP השווה (CMP (compare CMP destination, source
צירופי אופרנדים המותרים בהוראה זו הם: CMP register, immediate vale CMP register, register CMP register, memory CMP memory, register CMP memory, immediate vale

66 הוראת השוואה CMP לדוגמה, נכתוב תכנית הממיינת שני ערכים x, y, כך ש- x יכיל את הערך הגדול מבין השנים, ו- y את הערך הקטן. אלגוריתם:  השווה x=y? אם x <y אזי החלף x ו- y סיום-אם

67 הוראת השוואה CMP נניח כי x ו- y מוגדרים במקטע הזיכרון כמספרים לא מסומנים מטיפוס בית ונרשום את קטע הקוד המתאים: MOV AL, x ;AL=x CMP AL, y ; x=y? ; x >=y JAE end_if ; if x>=y then jeump end_if ; x<y XCHG AL, y ; AL = y, y =x MOV x, AL ; x=y end_if:

68 ביצוע תנאי אם...אזי

69 הוראת קפיצה שאינה מותנית –JMP (jump)
הוראת קפיצה שאינה מותנית מתבצעת ללא התניה: JMP label משמעות ההוראה היא: קפוץ להוראה שכתובתה מצוינת על ידי התווית, כאשר טווח הקפיצה יכול להיות לכל מקום בסגמנט הקוד. כלומר בעקבות ביצוע הוראה זו כתובת IP מוחלפת בכתובת שמציינת התווית: IP = label  במעבד 8086 ניתן להגדיר קפיצה מרוחקת FARלכתובת הנמצאת בסגמנט אחר. בספר זה לא נדון בסוג קפיצות זה

70 מימוש הוראת if ….then…else

71 . מימוש הוראת רב ברירהcase….of….

72 . מימוש לולאות


Download ppt "תכנות בסיסי בשפת סף פרק 5 מצגת 3."

Similar presentations


Ads by Google