Look-Up tables in Assembler

טבלאות חיפוש באסמבלר - דניאל חדש

 

מה היא טבלת חיפוש (Look-up Table) ?

 

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

 

למה צריך את זה ?

1. אמינות   עבור כל ערך שינתן לטבלה, יוחזר ערך מתאים - אין הרבה מקום לטעויות.

    2. מהירות  פעולות השליפה מהטבלה מבחינת המעבד הן יותר מהירות מאשר

פעולות ההכפלה והחילוק במקרה של פונקציה.

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

 

ניקח לדוגמא את חיישני המרחק שרובנו משתמשים בהם ברובוטים שלנו (GP2D12).

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

 

אז מה עושים??

 

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

ישנן כמה אפשרויות:

1. פונקציה

2. טבלת חיפוש

       3. לכתוב אי מייל ל - SHARP המייצרת את החיישנים, ולהגיד להם שזה לא נוח לנו הקריאות שהחיישן נותן... :)

 

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

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

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

 

בואו ניגש ישר לעניין ונראה איך עושים את הדבר הזה שנקרא טבלה.

 

דבר ראשון מחליטים על שם לטבלה, במקרה שלנו נקרא לה IR, בגלל שהיא תשמש לטיפול בקריאות של חיישני המרחק. (אינפרא אדום=IR = Infra Red , אורך הגל בו פועלים חיישני המרחק).

IR:

כעת, אנו יוצרים את הטבלה עצמה, כל שורה בטבלה מתחילה במילה השמורה FCB, שמשמעותה היא Form Constant Byte, ולמעשה היא מכניסה את הערך שבא אחריה לכתובת עליה מצביע מונה התוכנית. פקודה זו זהה לפקודה DB, שמשמעותה Define Byte, ואפשר גם להשתמש בה.

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

חשוב מאוד להכניס רק ערכים עשרוניים, כלומר על בסיס 10, אחרת הטבלה לא תעבוד.

 

כך צריכה להראות תחילת הטבלה שלנו  (הערכים הם רק דוגמא) :

 

IR:

        FCB 11

        FCB 12

        FCB 14

       

 

עכשיו מגיע הקטע המשמעותי והטריקי בעניין:

משמעות הקריאה שנקבל מהחיישן תהיה מס' השורות שנרד מהשורה הראשונה שבה כתוב FCB.

כלומר אם החיישן יחזיר לנו 02, אז המצביע של הטבלה יצביע על השורה  FCB 14, כי אם נרד מהשורה הראשונה שתי שורות נגיע לשורה זו. אם החיישן יחזיר 00 אז נעמוד על השורה הראשונה FCB 11.

 

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

נניח שהחיישן מחזיר את הערך 01 כאשר הוא רואה עצם במרחק 12 ס"מ ממנו, לכן השורה השנייה היא FCB 12, כי אנו יורדים שורה אחת מהשורה הראשונה ואז מצביעים על  FCB 12. בד"כ נרצה להשתמש בערך המתקבל, לכן עלינו להכניסו לאוגר (Accumulator)  או למשתנה בזיכרון.

הפקודה  B,X LDAA  מבצעת זאת, כאשר ב–B ישנו הערך שהחיישן נותן ובX ישנה הכתובת של תחילת הטבלה, לכן התוכנית הולכת לכתובת X בתוכנה ומתקדמת עוד B שורות. מכתובת זו נלקח הערך המתאים בטבלה, ונטען לתוך אוגר A. בדוגמא שלעיל, ייטען לאוגר A הערך0C  שהוא שווה ערך למספר 12 בבסיס 10 מהטבלה.

 

אם כן התוכנית שלנו צריכה להיראות כבר כמו משהו כזה:

 

LDX  #IR

LDAB  IR_FRONT

LDAA B,X

IR:

        FCB 11

        FCB 12

        FCB 14

ניתוח התוכנית:

הכנסנו ל–X את הכתובת של תחילת הטבלה ול–B את הערך שקיבלנו מהחיישן. לבסוף הפכנו ערך זה לסנטימטרים ע"י הכנסת הערך המתאים לו (בשורה B של טבלת IR) לאוגר A.

פשוט,  לא?

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

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

 

טיפ למתקדמים: אפשר להסתכל על כל התוכנה של הרובוט כטבלה אחת גדולה ולעשותה הרבה יותר מסודרת עם שימוש ב -  JSR LINES_DOWN_FROM ADDRESS, ADDRES , כדי לקפוץ בין סברוטינות.

חזרה




יש לך שאלה ואין לך את מי לשאול? פורום הרובוטיקה לעזרתך!

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

כל הזכויות שמורות לאסף פוניס, גיא יונה ואלי קולברג ©
אין להעתיק תכנים מאתר זה ללא רשות בכתב ממנהלי האתר

אתר זה נצפה באופן מיטבי ברזולוציית 1024X768