שאלה באסמבלר

אמיר ט

New member
שאלה באסמבלר

איך אני עושה פרוצדורה שמתפקדת כמו DELAY בפסקל או SLEEP ב C ? אמיר.
 

twiti

New member
שים לב שיש שני סוגים של השהיות

השהייה תלוית מכונה והשהייה מוחלטת (או השהיית שעון). השהייה תלוית מכונה ניתן לבצע על ידי כתיבת לולאה בגודל רצוי. השהייה מוחלטת ניתן לבצע ע"י שימוש בפסיקת שעון ובדיקת השעות/דקות/שניות.
 

אמיר ט

New member
השהיית "שעון"

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

כבר לא כתבתי באסמבלר מספר שנים, אז אני יכול לספר לך על העיקרון, אבל את המימוש תכתוב לבד. המימוש שלהלן אינו מייצר השהייה מדויקת מאוד וגם אינו השיטה היעילה ביותר האפשרית, אבל זו שיטה פשוטה יחסית. לכל PC יש פסיקת שעון קבועה שמתרחשת 18.2 פעמים בשניה, ובכל פעם שהיא מתרחשת מתבצעות בדיקות שונות ע"י ה-PC כמו למשל האם המשתמש הקיש על מקש כלשהו במקלדת וכו´. כדי ליצור השהייה, אתה מייצר 2 משתנים, אחד יהיה מונה והשני יהיה בינארי (הוא יקבע האם הזמן עבר כבר או עדיין לא). ברגע שאתה צריך את השהייה אתה מאפס את הבינארי, ומפעיל את פונקציית ההשהייה. בפונקציית ההשהייה יש קוד שמשתלט על פסיקת השעון, ומוסיף בפסיקה קטע שמגדיל את המונה, ובודק האם המונה כבר הגיע לערך מסויים אז הופך את הבינארי ל-1. כמו-כן בסוף הקטע צריך לקפוץ ולבצע גם את קטע הפסיקה המקורי. הערך המסויים נקבע ע"י חלוקת הזמן הדרוש ב-18.2 עתה פונקציית ההשהייה נכנסת ללולאה אינסופית שבודקת האם הבינארי הפך ל-1, ברגע שהבינארי השתנה ל-1, משוחזרת פסיקת השעון המקורית, והפונקציה מסתיימת, ואז התוכנית הראשית ממשיכה כרגיל. זה נשמע מסובך, אבל זה משהו כמו 20 שורות. ביי גיליוטין
 

שאקל

New member
השהיית שעון

Dealy proc push cx mov cx,1000 l1: push cx mov cx,0ffffh l2: loop l2 pop cx loop l1 pop cx ret Delat endp אם אתה רוצה להגדיל או להקטין את ההשהיה רק תשנה את המספר 1000 שמוכנס לcx. 1000 אמור לתת לך השהיה של שניה אחת. תנסה.
 

שאקל

New member
תיקון קטן

שורה אחרונה זה delay endp כמובן. מקוה שעזרתי.
 

אמיר ט

New member
תודה רבה

אתה יכול רק להסביר לי איך בדיוק עובדת הפרוצדורה הנ"ל ? אמיר.
 

שאקל

New member
מתבסס על פולסי שעון

פקודת mov למשל לוקחת 3 פולסים של שעון פקודת loop לוקחת 2 פולסים של שעון התדר בלוח אם הוא f=100Mhz שזה 10 בחזקת 8. כמה זמן לוקח פולס אחד? t=1/f זה 10 בחזקת מינוס 8 nSec. שזה שווה ל-10 nSec ffffh זה 65,536 תכפיל את זה בשני פולסים של שעון בלולאה l2. תוסיף 3 שזה פקודת mov. את התוצאה מכפילים ב-10nSec לבסוף מקבלים 1.3Msec ועל זה מתבססת פונקציה. לצערי קצת קשה לכתוב פה מתמטימיקה ומספרים אך זה החישוב. יש בפונקציה לולאה בתוך לולאה. אנחנו מריצים את ffffh בתוך cx שזה 65,536 עד שהוא מתאפס. הלולאה החיצונית דואגת שהריצה הזו תתבצע 1000 פעם.
 
תיקון גדול - זו השהייה תלויית מכונה

אם תריץ אץ התוכנית הזו על מחשבים שונים העובדים במהירות שונה, תקבל השהייה שונה, כי בכל מחשב זמן מחזור השעון שונה ולכן זמן ביצוע פקודה בודדת משתנה. אפשרות המימוש שהצעתי לעיל אמנם לא מדויקת מאוד (עד כדי 1/18.2 שניה) אך מצד שני תפעל באופן זהה על כל מחשב PC מכיוון שהיצרן דואג שלוח-האם יספק את פולסי השעון במהירות הדרושה, ללא קשר ל-CPU המותקן בלוח-האם. אם אתה מעוניין ליצור השהייה מדוייקת באמת, אתה צריך להשתלט על שעון זמן-אמת שיש על הלוח-אם (אני לא זוכר את מידת הדיוק שלו, אבל אני בטוח שזה לפחות מילי-שניה), ואתה צריך גם להריץ רק TASK בודד (כלומר יהיה קשה לכתוב את זה בסביבת WINDOWS ולקבל משהו מדוייק). איך לממש דבר כזה? את זה אני כבר לא זוכר, תצטרך להיעזר בספרות מקצועית. ביי גיליוטין
 

twiti

New member
פקודת מעבד מתבצעת במעבד ולכן

ההשהייה שציינת היא תלויית מכונה כלומר מעבד אחד מבצע 100 מיליון פעולות (דפקים) בשניה (100 MHz) ואילו ואילו מעבד אחר מבצע 1 מיליארד פעולות (דפקים) בשניה (1 GHz). השהייה מדוייקת (השהיית שעון) מתבצעת ע"י חיבור לשעון של המחשב. צירפתי שלושה קבצים מכווצים (שנה את הסיומת ל-zip) המכילים דוגמאות לשימוש בשעון המחשב. מדובר באסמבלר 8086. יש צורך בעורך DOS ע"מ לקרוא את התיעוד.
 

voguemaster

New member
כן רק שדפקים שונים מפעולות

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