
הטקסט המלא של הדקות הראשונות בהרצאה «כתובות זיכרון באסמבלר ובשפת מכונה» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם, בהרצאה הזו אני רוצה להראות לכם כמה מסוכן להוסיף פקודות באסמבלר כי זה מזיז לנו את כל הכתובות בזיכרון למה זה יכול לגרום ואיך להתגבר על הבעיות האלו. הרי מה עשינו בפעמים הקודמות?
הוספנו פקודה חדשה לקובץ ברמת אסמבלר, זאת אומרת היה לנו פה 77 והוספנו עוד פקודה, פיצלנו אותו ל-70 ועוד 7 והוספנו עוד פקודה. מה הבעיה שזה הזיז לנו את כל הכתובות בזיכרון והאמת היה לנו מזל שכל זה עובד.
אני אראה לכם למה זה יכול לגרום ואיך להתגבר על הבעיה הזאת. בואו נתחיל מזה שנעביר את הכל לכלי יותר גרפי שיראה לנו את כל הקוד הזה בצורה יותר גרפית.
אז אני לוקח אותו בלי cc, בלי הפאוזה הזאת שעשיתי. את הקוד מקור עצמו, כולל השינויים שלנו. זה פחות חשוב השינויים. בואו ננקה אותו.
למה אני צריך לנקות אותו? כי אני רוצה להעביר אותו לאתר הזה ופה הוא מפרש את הפקודות בשפת מכונה רק לפי מספרים, הוא לא צריך את כל ה-0x הזה, יבלבל אותו. אז ככה, אז אנחנו רוצים רק מספרים, אז בואו נוריד את כל ההערות שלנו, שזה לא יבלבל אותו.
ככה אני מוריד את כל מה שמיותר. התוכנה הזאת, הכלי הזה, פשוט מראה לי את זה יותר בצורה גרפית ונוכל ממש לראות את הבעיה בצורה ויזואלית ויפה. בינתיים מה שאני עושה פה אני רק מנקה את כל ההערות את השורות הריקות ורוצה להוריד את כל ה-0xים האלו אז אני בא לאדיט ועושה ריפלייס תחליף לי בוא נעשה את זה על כל המסך שיהיה לנו יותר נוח
אדיט ריפלייס תחליף את כל ה-0x ברווח רווח אחד אני עושה לו כן רווח אחד ריפלייס הופה נהיה הכל עם רווחים יפה מאוד ואת כל הפסיקים תחליף בכלום לא רוצה כלום אני לא רוצה פסיקים, יופי, יש לנו רק מספרים מסוזרים וזה מה שהכלי הזה רוצה לקבל מאיתנו.
זה אתר שעושה בלייב דיסאסמבלר לקוד ומראה לי אותו עם חיצים כאלו של לולאות ובגרף כזה מראה לי, אתם רואים פה איך זורם הקוד. אז הוויזואליזציה הזאת, אני ממש אוהב אותה וזה מה שאני רוצה להראות לכם.
בואו נכניס את הזה שלנו ונגיד לו שזה הולך להיות x86 64 ביט יופי יופי בואו ניתן לו דיסאסמבלר הנה הוא הופך את זה לקוד שלנו אתם רואים פירש את האותיות את המספרים fc48 83 הוא פירש את הכל לשפת אסמבלר זאת שפת מכונה פירשנו לשפת אסמבלר ולמה אני אוהב את הכלי הזה כי הוא מראה לי פה חצים ואומר לי לדוגמה שזה קופץ מפה לשם
בואו תראו מה שקורה פה שהפקודה הזאת, מה היא עושה? אולי נוכל לראות את זה גם בגרף. גרף זה מבט אחר על אותו קוד, פשוט כבלוקים, זה בדיוק אותו דבר.
אנחנו יכולים לראות פה שהוא משווה את ה-AL, את הרגיסטר, את המשתנה בזיכרון, שהוא צמוד למעבד, את הרגיסטר AL למספר 61. אם AL פחות מ-61, אתם רואים? Jumpless, פחות מ-61, הוא יקפוץ לכאן.
אם הוא יותר מ-61, הוא לא יקפוץ הוא ייקח את האדום הוא לא יקפוץ וייבצע פקודה של תוריד מ-AL 20 ואז תמשיך הלאה זאת אומרת שאם במשתנה AL ברגיסטר AL יש מספר מעל 61 הוא מוריד לו 20 ואז ממשיך אם הוא פחות מ-61 אם הוא פחות מ-61 הוא לא יוריד 20 אלא ישר
ידלג לכאן זאת אומרת זה סתם איזשהו תנאי כזה אם זה יותר מ-61 תוריד לו 20 ואז תמשיך אם זה פחות מ-61 אל תוריד כלום. Jumpless תקפוץ אם זה פחות מ-61. קוד נורא פשוט.
עכשיו אני הולך להוסיף לו פה פקודה. עכשיו, איפה הבעיה? הבעיה היא שהוא מקובע פה לכתובת בזיכרון, לכתובת 37. זאת אומרת, הוא משווה AA ל-61 ומדלג לכתובת 37.
מה יקרה אם אני אכניס פה דברים? נניח אני אכניס פה איזושהי פקודה כאן בדיוק, בכתובת 35, בואו נראה את זה כאן. זה אותו דבר, אתם רואים?
פשוט כאן הגרפיקה היא ככה עם חצים פה בצד. אתם רואים? הוא משווה AL ל-61. אם זה Jumpless קופץ לכתובת 37, ואם זה לא, פחות מ-61, אז הוא יוריד 20 ואז ימשיך כאן.
זה בדיוק אותו קוד, פשוט שם זה עם ריבועים, פה זה עם חצים. עכשיו, מה יקרה אם אני אוסיף פה פקודה? אם אני אכניס פה איזושהי פקודה, בא לי להכניס פה פקודה באמצע תוכנית.
כתובת 37, הכל יזוז למטה, נכון? ואז הפקודה הזאת שהייתה ב-35 היא תהפוך ל-37 כי הכל יזוז. הזיכרון לא זז, אני פשוט בתוך הזיכרון מזיז דברים ודופק את כל הג'אמפים.
בואו נראה איך זה קורה בפועל. בואו נחפש 7C02 פה. אני אלך לכאן, אני לוחץ קונטרול F, 7C02. איפה ה-7C02? צריך רק רווח לעשות פה. הנה, 7C02.
זו הפקודה בשפת מכונה. רגע רגע רגע זה 2C20 לא 02 הנה 2C20 ואחרי זה 41C1C90D 41C1C90D יופי אני לוקח פה ומוסיף פקודה איזה פקודה? פקודה בשפת מכונה שלא עושה כלום יש פקודה שנקראת נופ שאומרת אל תעשה כלום הנה הוספתי שני נופים אתם רואים? נופ הזה זה בשפת אסמבלר אל תעשה כלום סתם דלג הלאה הוספתי שני נופים ותראו מה קרה
אם AL פחות מ-61, הוא משווה אותו, קומפר AL ל-61, קומפר, משווה ביניהם, עושה ג'אמפ לס, קופץ ל-37.
הכתובת נשארה, אבל שימו לב, עכשיו הוא תמיד יבצע את הפקודה של הורדה של ה-20. הוא ידלג על הנופים, הבנתם? בואו אני אראה לכם עוד פעם.
תראו מה היה, היה ככה, תסתכלו כאן. הוא היה לפעמים עושה את הפקודה שלו, הורדת ה-20, ולפעמים לא. לפעמים הוא היה מדלג עליה. עכשיו הוא תמיד יעשה אותה.
ככה זה היה במקור, jumpless, קופץ לפה ולא מבצע את הפקודה הזאת כל פעם, אלא רק אם הוא מעל 61 באקסה. עכשיו תסתכלו איפה הבעיה עוד פעם.
ברגע שאני מוסיף שני נופים שלא עושים כלום, הפקודה הזאת תזוז לכאן והיא תתבצע תמיד. למה? כי הכתובות, כי הפקודות קפיצה, שזה כל הלולאות, כל התנאים, מקובל לכתובת פיזית בזיכרון. אתם רואים? 37.
תראו מה קרה. הופה. אתם רואים התפספו פה שני נופים זה זז למטה אבל הכתובת לא זזה עכשיו מה אני צריך לעשות כדי שההיגיון של התוכנה יישאר למרות שהוספתי שני דברים להגיד לו לקפוץ לא ל-37 אלא ל-39 להוסיף לו עוד שניים בקפיצה זאת אומרת שאם הוספתי פה פקודה חדשה באמצע עכשיו אני צריך להוסיף לכאן את הכתובת בעצם להזיז אותה מ-7C02 להזיז את הקפיצה מכאן
שיקפוץ כבר לא ל-37 אלא ל-39. אז זה 7C02. אז הפקודה הזאת של 7C02, זאת זאת, צריך להגיד לה, תקשיבי, אל תקפצי עכשיו לכתובת 37, תקפצי ל-39.
עכשיו, מה שקורה זה פה ש-7C זה פקודת ג'אמפ, ו-02 זה כמה בתים לקפוץ קדימה. הוא היה מדלג על שני בתים. אתם רואים, הוא היה מדלג על 2C20 על שני בתים.
עכשיו הוא צריך לדלג על שני בתים של הנופ ועוד שני בתים של הסאב הזה. זאת אומרת, הוא צריך לדלג עכשיו על ארבע בתים.
אז אם אני מזיז עכשיו את הכתובת ל-C704, זאת אומרת, הוזסתי בעוד שתיים, זה אומר, אמרתי לו לדלג לא שני בתים אלא לדלג ארבע בתים, וההיגיון חזר חזרה.
שימו לב, התוכנה חזרה לתפקד כמו שצריך, הוא משווה עם 61, הוא עושה שני נופים כמו שרציתי, מבצע את הפקודה הורדה ואז ממשיך הלאה, מדלג למקום הנכון מעל הפקודה הזאת עכשיו עוד פעם אני מדגיש שאם אנחנו מוסיפים פקודות באמצע אסמבלר אנחנו צריכים להיות מודעים לזה שיש כל מיני תנאים ולולאות שהכתובות שם יחסיות זה אומר דלג ארבע בתים
דלג שני בתים זה כתובות יחסיות בג'אמפ והכל זז כי פתאום שהוא מדלג על שני בתים הוא מדלג על השניים הישנים ואני הוספתי עוד שניים חדשים אז צריך לדלג על ארבע אז צריך להיות מודעים לזה עכשיו אתם חושבים שפתרנו את כל הבעיה?
אז התשובה היא לא. למה לא? זה שפתרנו את הבעיה כאן לוקאלית, וזה נהדר, זה באמת ממשיך לעבוד כמו שצריך. הבעיה שיש לנו פה עוד חץ בצד שמאל, שגם כל הקוד המקורי הזה, כל הבלוק הזה, הוא חלק מתוך עוד איזושהי לולאה או איזשהו תנאי.
וגם פה בצד שמאל, אתם רואים, יש עוד דילוג. הקו הזה אומר שזה כאילו חלק מלולאה או חלק