תשובה קצת יותר מלאה
אשלים את שתי התשובות האחרונות ביתר פירוט. ראשית כל, כפי שנאמר, כל מטריצה היא בעצם מערך ליניארי של תאי זיכרון. בוא נניח שמדובר במערך של 10x10 לצורך הדוגמה. נניח שהאינדקסים של השורות מסומנים ב - i ורצים על התחום 9..0. נניח שהאינדקסים של העמודות מסומנים ב - j ורצים על התחום 9..0. נניח שמדובר במערך של מילים (words). עכשיו ניקח כמה דוגמאות: 1. אנחנו רוצים את הפינה השמאלית העליונה. מדובר בתא (0,0). זה התא המצוי בהיסט 0 בתוך המערך. כלומר, כדי להעביר ל - AX את תוכן התא הנ"ל נבצע: MOV SI,0 [MOV AX,DS[SI 2. אם נרצה את התא (0,4), כלומר - התא החמישי בשורה הראשונה, נקבל: MOV SI,4 [MOV AX,DS[SI 3. אם נרצה את התא (1,0), כלומר - התא הראשון בשורה השניה, זה יהיה בעצם התא ה - 11 במערך, והוא יישב בהיסט 10 (זוכר? התא הראשון יושב בהיסט 0!). למה זה התא ה - 11 במערך? כי השורה הראשונה היא התאים 10..1, השורה השניה היא התאים 20..11 וכו´. בקיצור, (1,0) יהיה: MOV SI,10 [MOV AX,DS[SI 4. ודוגמה אחרונה: התא (6,3), שהוא התא הרביעי בשורה השביעית - הוא יהיה בהיסט 63. למה? כי השורה השביעית היא התאים 70..61, שיושבים בהיסטים 69..60. התא הרביעי הוא 63. MOV SI,63 [MOV AX,DS[SI ומכאן הגענו לנוסחה הפשוטה שמחשבת את ההיסט של התא במטריצה. נניח ש - N הוא גודל השורה (במקרה הנ"ל, 10) - הנוסחה היא i*N+j. תבדוק את זה על הדוגמאות ותראה. כל מה שנותר לך עכשיו זה להמיר את המיקומים במטריצה להיסטים הללו. אפשר לעשות את זה עם מקרו פשוט (אם למדת מקרואים), ואפשר לעשות את זה ידנית. אפשר גם לשפר את זה בכל מיני דרכים ולחסוך חישובים מיותרים... הרי זו כל המטרה של השפה! ומכאן לנושא השני שהוזכר כאן. עניין החוקיות מקנה לנו את היכולת לקחת בעיה, להבין מתוכה פרמטרים נוספים, להסיק חוקיות, ובכך לכתוב תוכנית הרבה יותר פשוטה. בוא נבדוק את החוקיות באלכסון הראשי. האלכסון הראשי רץ על התאים - (0,0), (1,1), (2,2). בוא נבדוק את ההיסטים של התאים. התא הראשון : (0,0) - היסט 0, כמובן. התא השני : (1,1) - היסט 1+1*3 = 4. התא השלישי : (2,2) - היסט 2+2*3 = 8. שים לב להפרשים. ההפרשים בין ההיסטים הוא 4. אולי שמת לב גם שההפרש הוא כגודל השורה + 1. זה נכון תמיד, ואפשר להוכיח את זה פשוט באמצעות אינדוקציה, אבל את זה אני אשאיר לכם כתרגיל בית
בקיצור, מה הבעיה להתחיל מהיסט 0, ולהתקדם כל פעם 4 תאים קדימה, ולבצע את הפעולה כולה 3 פעמים (כמספר השורות)? נסה לעשות את אותו הדבר על האלכסון המשני ותראה מה אתה מקבל. בהצלחה!