עבור לתוכן

פסיקה באסמבלי

Featured Replies

פורסם

נתונה התוכנית הבאה:

NUM: MOV SI , 10H

MOV DI , 16H

MOV CX , 6H

ON: MOV AL , [sI]

AND AL , 0FH

MOV [DI] , AL

INC SI

INC DI

LOOP ON

RET

מישהו יכול לומר לי מה עושה התוכנית בבקשה ?......

תודה !

פורסם

אני בכלל לא רואה כאן בקשת פסיקה. איך הגעת לזה?

פורסם

קודם כל, נתחיל בזה שזה לא פסיקה בכלל, אלא רק לולאה שרצה מספר מסוים (6) של פעמים.

התוכנית לוקחת מספר שנמצא בתא מסויים, מבודדת את הסיפרה הימינית שלה (למשל, B8 יחזיר 08), ומכניסה ערך זה לתא שנמצא במיקום השישי שאחריו.

הפקודה AND מכניסה לתוך הערך AL (שקיבל את הערך שנמצא בתא מסויים, SI) את המכפלה הלוגית של אותו מספר (1*1=1, וכל מכפלה אחרת שווה 0), ולאחר מכן מכניסה מספר זה לתא שנמצא במיקום השישי שאחריו (DI).

הלולאה הזאת רצה 6H פעמים (שזה בעצם 6), כאשר הפעולה LOOP מורידה את הערך של CX באחד, ובודקת שאם CX שונה מ-0, היא תעשה JMP לתווית ON.

נ.ב. היא לא משווה באמת את הערך של CX ב-0, אלא רק בודקת עם אוגר הדגלים אם הערך שווה 0 (הפקודה DEC מקפיצה את ZF)

פורסם
  • מחבר

הבנתי...

אבל מה התוכנית עושה ??????????

יש לה מטרה לא ?

פורסם

לוקחת את ארבעת הביטים של מספר תאים בזיכרון, ושמה אותם במקום אחר בזיכרון.

פורסם
  • מחבר

תודה בנאדם...

אבל מה עושה הפקודה AND AL , 0FH

ולשם מה שמו אותה? כלומר מה ההיגיון בה ?

פורסם

ככה בוחרים את ארבעת הביטים.

הפקודה and אומרת למעבד לבצע "וגם"(פעולה לוגית) בין 2 ערכים. בפועל יש לך:

רצף כלשהו של 8 ביטים(al). לדוגמא:

01001011

ועוד רצף של 8 ביטים(0Fh):

00001111

כאשר אתה מבצע ביניהם וגם, אתה מקבל:

00001011

את התוצאה שמים ב- al.

פורסם
  • מחבר

הבנתי.. תודה.

עכשיו... הפקודה TEST הבנתי שעושה אותו הדבר אבל ללא שינוי אוגר היעד (ההוא שנשמרת בו התוצאה).

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

פורסם

הפקודה TEST אמנם לא משנה את הערך שיש באופרנד הראשון, אבל כן מפעילה את אוגר הדגלים. הפקודה JZ, שהיא במילים פשוטות Jump If Zero, הולכת לפי אוגר הדגלים.

כאשר התוצאה של הפקודה האחרונה שהופעלה, במקרה זה TEST, הינה 0, אוגר הדגלים מורם ו JZ יעבוד.

פורסם

התוכנתי היא אכן פסיקה.

המילה RET בסוף התוכנית היא מילת סוף פסיקה שאומרת למעבד לשלוף חזרה את האוגרים IP CS ע"מ לחזור לתוכנית הראשית מאיפה שהיא הפסיקה.

בכל מקרה, התוכנית רצה על 6 תאים בזיכרון שמוצבעים ע"י SI ובסך הכל ממסכת את הארבע סיביות ה MSB של הנתון, ואת התוצאה היא שומרת בכתובת ש DI מצביע עליו. DI ו SI רצים ביחד ככה שהשמירה נעשית בצורה יחסית.

פשוט וקל.

אם אץה צריך עוד עזרה שלח לי בפרטי.

פורסם

עבר קצת זמן, אבל נדמה לי שבאופן נורמלי בשביל לחזור מפסיקה צריך IRET ולא RET רגיל.

פורסם
  • מחבר

צודק..

Interupt Return....

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים